반응형

[프록시 패턴 바로가기]


스마트 참조자는 위의 게시글에서 말했듯이 스마트 포인터이다.


스마트 포인터는 C++ 프로그래머에게 있어서 필수라고 봐도 무방하다.


C++과 Java & C#의 가장 큰 차이점은 Garbage Collection 이다.



Java와 C#을 배웠던 사람이라면 포인터가 없다는 것을 알고 있을 것이다.


new와 delete가 있는데도 포인터가 없다?


이는 Garbage Collection이 할당했던 메모리들을 자동으로 해제해주는 것을 의미한다.



처음 프로그래밍을 접하고 누구나 어렵다고 하는 개념은 포인터이다.


앞서 말했던 Java & C#은 포인터를 사용할 필요 없이, 할당만 해주면 똑똑한 컴파일러가 알아서 해제까지 해주기 때문에 메모리 관리를 거의 관여할 필요가 없다.


그에 비해 C와 C++은 프로그래머가 할당과 해제를 전부 신경쓰고 손수 작업해서 메모리 누수를 방지해야한다.


이러한 고충을 해결하는 방법이 바로 스마트 포인터이다.



스마트 포인터의 기본 개념은 해제가 자동으로 호출되게 한다. 라는 개념부터 출발하면 좋을 듯 하다.


해제가 자동으로 호출되게 한다? 여기서 해제를 소멸자로 바꾸어 이해해보자.


소멸자가 자동으로 호출되게 한다?


C++에서 소멸자가 호출되는 경우는 클래스이다.


클래스 중에서도 포인터가 아닌! 클래스이다.


포인터가 아닌 클래스 변수는 종속되어 있는 범위가 끝나는 시점에 호출된다.


결론은 포인터가 아닌 클래스 변수 내에 사용하고 싶은 포인터가 있으면 된다는 것이다.


포인터가 아닌 클래스 변수 내에, 즉 클래스 내에 스마트 포인터로 사용하고 싶은 타입의 메모리를 할당하고,

소멸자에 해제를 해주면!


해제가 자동으로 호출되는 구조를 만들 수 있는 것이다.


마지막으로 원하는 타입을 가지기 위해서는? 바로 Template을 사용하면 된다.

(Template가 무엇인지는 알고 계시리라 믿고, 넘어가겠습니다.)


코드를 확인해보면,




기본적인 구조는

생성자 / 소멸자 / operator* / operator->

로 이루어져있다.


해제가 이루어지는 곳은 소멸자이고, operator* / ->를 통해 포인터와 같은 방법으로 사용할 수 있다.


코드만 보아서는 차이를 느끼지 못할 수도 있다.


그래서 일반 포인터와 스마트 포인터의 차이점을 확인해보겠다.




위의 코드를 각 각 실행시켜 보면 아래와 같다.




결과로만 보고 따지면 스마트 포인터가 생성자와 호출자를 두 번 호출하기 때문에 비효율적으로 보인다.


하지만 프로그래머의 실수로 해제(delete)를 제대로 해주지 않았다고 상상해보라.


메모리 누수로 인한 에러부터 시작하여, 해제를 안해준 곳을 찾느라 디버깅에 시간을 투자해야 할 것이다.


하지만 스마트 포인터는 해제를 신경쓰지 않아도 컴파일러가 알아서 소멸자를 통하여 해제해주기 때문에 더 빠르게 코딩하는 것이 가능하다.


또한, Template Class가 아니더라도, 일반 클래스를 통한 스마트 참조자로써 해당 포인터의 참조 횟수와 같은 operator에 대한 작업도 가능하다.


포인터를 직접 사용하여 메모리를 할당, 해제하는 것과 스마트 포인터를 사용하는 것은 프로그래머의 개인 차이이므로 자신에게 맞는 코딩법을 찾는 것이 중요하다고 생각한다.


물론, 팀 작업을 함에 있어서는 복잡한 코드보다는 간결한 코드가 훨씬 효율적일 수는 있다.

반응형

+ Recent posts