더북(TheBook)

이제 vector 컨테이너에는 Checkout 객체에 대한 유니크 포인터가 저장된다. vector의 반복자는 Checkout 객체에 대한 포인터, unique_ptr<Checkout> 객체를 가리키므로 반복자가 가져온 Checkout 객체의 함수 멤버를 호출할 수 있다. 함수 멤버를 호출할 때는 반복자를 역참조한 다음에 간접 멤버 선택 연산자(indirect member selection operator)를 사용해 함수를 호출해야 한다. main() 함수에서도 몇 가지 문장이 변경되었다. min_element() 알고리즘은 < 연산자를 사용해 반복자가 가리키는 원소들을 비교하고 결과를 결정한다. 이러한 기본 동작은 스마트 포인터를 비교하는 게 되어서 올바른 결과가 될 수 없다. 따라서 min_element()의 세 번째 인수에 사용할 비교식을 지정해야 한다. 여기서는 람다 표현식으로 정의하고, 이름은 comp로 지었다. 이 람다 표현식은 한 번 이상 쓰기 때문에 이름을 붙였다.

람다 표현식에서는 스마트 포인터 인수를 역참조해 Checkout 객체에 접근한 다음에 Checkout 클래스의 operator<() 멤버를 사용해 두 Checkout 객체를 비교한다. Checkout 객체와 Customer 객체는 모두 자유 공간에 생성된다. 스마트 포인터는 자유 공간에 할당된 객체의 메모리 해제를 처리해준다. 이 시뮬레이션 프로그램을 실행한 결과는 앞의 원본 프로그램과 같다. 예제에 shared_ptr<T>를 사용할 수도 있지만, 실행은 조금 느려질 것이다. unique_ptr<T> 객체가 실행 시간과 메모리 관점에서 원시 포인터와 비교해도 오버헤드가 아주 적다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.