[C++] 항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자

업데이트:     Updated:

카테고리:

태그:

이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
이펙티브 C++ 제3판, 스콧 마이어스 저자, 곽용재 번역

📦 9. 그 밖의 이야기들

👉🏻 항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자

📚 C++ 표준의 역사

  • 1998년: C++의 표준(언어를 정의한 문서 및 라이브러리 집합)이 최종 승인되었다
  • 2003년: C++98, 전체 틀을 해치지 않는 버그 수정판이 나왔다
  • 2011년: C++0x(현재 C++11로 불림)가 출시되었다
    • TR(Technical Report) 1과 2가 일부 포함되었다

🔧 C++98 표준 라이브러리 구성 요소

표준 템플릿 라이브러리(STL):

  • 컨테이너, 반복자, 알고리즘, 함수 객체, 컨테이너 어댑터, 함수 객체 어댑터 등이 있다

iostream:

  • 사용자 정의 버퍼링, 국제화 기능이 가능한 입출력을 지원한다
  • cin, cout, cerr, clog 등의 사전정의 객체를 지원한다

국제화 지원:

  • 여러 로케일(Locale)을 활성화시킬 수 있는 기능 포함
    • 로케일: 사용자가 UI에서 국가, 지역에 따라 선호하는 내용을 저장해둔 것
  • wchar_t(대개 16비트/문자) 및 wstring(wchar_t 타입으로 정의한 string) 등을 쓰면 유니코드를 사용할 수 있다

수치 처리 지원:

  • 복소수를 나타내는 템플릿(complex)
  • 수치 배열을 나타내는 템플릿(valarray)

예외 클래스 계통:

  • 최상위 클래스 exception
  • exception의 파생 클래스인 logic_errorruntime_error

C89의 표준 라이브러리:

  • 1989년의 C의 표준 라이브러리 모두 포함

🆕 TR1의 구성 요소

스마트 포인터:

  • shared_ptr, weak_ptr
    • 동작은 기본제공 포인터와 동일
    • 참조 카운팅(reference counting) 사용

tr1::function (항목 35):

  • 어떤 함수가 가진 시그니처와 호환되는 시그니처를 갖는 함수호출성 객체의 표현을 가능하게 해주는 템플릿
// int를 받고 string을 반환하는 함수가 매개변수 타입
void registerCallback(string func(int));
// 매개변수 이름을 생략할 수도 있다.
void registerCallback(string (int));

// 반환 값, 매개변수 값을 암시적으로 변환할 수 있는,
// 함수를 매개변수로 설정할 수 있게 된다.
void registerCallback(function<stirng>(int) func);
  • string(int) 부분이 함수 시그니처이다

tr1::bind (항목 35):

  • 상수/비상수 멤버 함수 상관없이 동작한다
  • 참조로 전달되는 매개변수에도 동작한다
  • 함수 포인터를 자체적으로 다룰 수 있다

해시 테이블:

  • set, multiset, map, multimap을 해시기반 컨테이너로 구현하는데 해시 테이블이 사용되었다
  • unordered_set, unordered_multiset, unordered_map, unordered_multimap이 그들이다
  • 기존 컨테이너와의 차이점으로 원소 저장 순서를 예측할 수 없다

정규 표현식:

  • 정규 표현식 기반의 탐색과 문자열에 대한 대체 연산이 가능하다
  • 일치되는 원소들 사이의 순회를 지원한다
  • 현재 <regex> 라이브러리에 포함되어 있다

튜플(tuple):

  • pair 템플릿의 신세대 버전이다
  • pair은 2개만 담을 수 있었던 반면, tuple은 얼마든지 담을 수 있다

tr1::array:

  • begin, end 등과 같은 멤버 함수를 지원한다
  • array 객체 크기는 컴파일 과정에서 고정된다
  • 즉, 동적 메모리를 사용하지 않는다

tr1::mem_fn:

  • 멤버 함수 포인터를 적응(adapt)시키는 용도에 쓸 수 있는 템플릿이다
  • C++98의 mem_funmem_fun_ref의 확장 버전이다

tr1::reference_wrapper:

  • 기존 참조자가 객체처럼 행사할 수 있도록 하는 템플릿이다

난수 발생:

  • C 표준 라이브러리의 rand보다 훨씬 우수하다

특수 용도의 수학 함수:

  • 라게르(Laguerre) 다항식, 베셀(Bessel) 함수, 완전 타원 적분(complete elliptic integral) 등 다양한 수학 함수들이 있다

C99 호환성 확장 기능:

  • C99의 새로운 라이브러리를 C++로 가져올 목적으로 설계된 함수 및 템플릿 모음

타입 특성정보(type traits):

  • 컴파일 타임에 주어진 타입 정보를 제공하는 특성정보 클래스(항목 47 참조)
  • T라는 타입에 대해 기본제공 타입인지, 가상 소멸자를 지원하는지,
    공백 클래스인지, 다른 U 타입으로 암시적 변환이 가능한지 등의 정보를 알 수 있다

tr1::result_of:

  • 어떤 함수 호출의 반환 타입을 추론하는 템플릿
  • 함수(템플릿)의 호출로 반환되는 객체의 타입을 알고 싶을 때 사용한다

💡 TR1스럽게 사용하기

namespace std {
	namespace tr1 = ::boost;
}

과거의 사용법:

  • 부스트의 TR1스러운 라이브러리를 써보고자 할 때 사용했다
  • 이러한 꼼수를 사용했을 때의 결과는 정의되어있지 않다
  • 현재는 사용할 필요가 없다

🧐 정리

최초에 상정된 표준 C++ 라이브러리의 주요 구성요소:

  • STL
  • iostream
  • 로케일(locale)
  • 수치처리 지원
  • 예외 클래스 계통
  • C89 표준 라이브러리

TR1에서 추가된 것:

  • 스마트 포인터
  • 일반화 함수 포인터
  • 해시 기반 컨테이너
  • 정규 표현식
  • 이외 10개로, 총 14개

TR1 기능 사용:

  • TR1의 기능을 사용하기 위해선 명세를 구현한 코드가 필요하다
    • TR1 구현을 구할 수 있는 곳이 부스트이다
    • 현재는 필요없다

Cpp 카테고리 내 다른 글 보러가기

댓글남기기