프로그래밍/C++2012. 4. 25. 20:04

스마트 포인터란?

 

스마트 포인터는 다른 객체의 포인터 역활을 하는 객체이다.  여기서 중요한 것은 '포인터가 아닌' '객체'이다.

예제를 보자.

 

스마트 포인터가 추가되면 다음과 같다.

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
Posted by code cat