스마트 포인터란?
스마트 포인터는 다른 객체의 포인터 역활을 하는 객체이다. 여기서 중요한 것은 '포인터가 아닌' '객체'이다.
예제를 보자.
스마트 포인터가 추가되면 다음과 같다.
sp를 보면 포인터는 아닌데, sp->goo()를 하는 걸 보면 포인터 같기도 하고, 헷갈린다?
우선 Sptr sp = new Obj 는 Sptr sp(new Obj)와 같다. C++에서 객체의 대입, a = new b 는 a(new b)라고 생각해도 무방하다. Sptr의 생성자를 보면 Obj* p를 인자로 받고, Obj* s_obj를 p로 초기화 시켜준다. 결국 sp는 Obj* 를 멤버로 갖는 객체가 생성된 것이다.
그럼 ->는 무엇인가? 그것은, 연산자 오버로딩을 통해 구현된 것이다.
Obj* operator->() { return s_obj; }
결국엔 Obj* 타입인 s_obj를 리턴하는 것이다. 그럼 결국엔,
sp->goo()는 (sp.operator->())goo()
인 것이고 sp.operator->()는 Obj*를 리턴함으로,
(sp.operator->())->foo()로 해석하게 되어 마치 포인터로 함수를 호출하는 거처럼 작동한다.
다시 말해 스마트 포인터(sp)는 객체이지만 마치 다른 객체(Obj)의 포인터(Obj*)역활을 한다.
레퍼런스 카운팅
위에서 보다싶이, 내부적으로 포인터 변수를 가지고 있으므로, 얕은 복사(shallow copy)가 발생할 확률이 높다.
물론 이를 방지하기 위해, 깊은 복사(deep copy)를 구현할 수도 있으나, 이는 성능이슈 및 스마트(?)하지 않으므로, 대신 레퍼런스 카운팅 기법을 쓰는게 좋다.
'프로그래밍 > C++' 카테고리의 다른 글
cout , endl 의 원리 (0) | 2012.04.28 |
---|---|
Android Framework 분석을 위한 C++ 4일차 (0) | 2012.04.26 |
Android Framework 분석을 위한 C++ 3일차 (0) | 2012.04.25 |
swap 함수 (0) | 2012.04.25 |
Android Framework 분석을 위한 C++ 2일차 (0) | 2012.04.24 |