가비지 컬렉터와 스마트 포인터란 무엇인가?
가비지 컬렉터와 스마트 포인터란 무엇인가?
가비지 컬렌션은 무엇인가?
가비지 컬렉션(Garbage Collection)이라고 불리면 약어로 GC라고도 부른다. 메모리를 관리하는 방법 중에 하나로, 시스템에서 더이상 사용하지 않는 동적 할당된 메모리를 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것을 의미한다.
그리고 이 GC를 수행하는 부분을 가비지 컬렉터라고 부른다.
더이상 필요없는 메모리는 쓰레기라고 하며 이 쓰레기를 효과적으로 처리하는 작업이 가비지 컬렉션이라 하며 이 작업을 수행하는 것이 가비지 컬렉터이다.
가비지 컬렉터가 하는 역할
▸ 메모리 할당
▸ 사용 중인 메모리 인식
▸ 사용하지 않는 메모리 인식
가비지 컬렉터의 한계
실시간으로 쓰레기를 수집해야하기 때문에 런타임 동안 작업을 하며 그렇기에 성능이 떨어질 수 있다. 또한 더 이상 접근이 불가능한 객체만 회수하기 때문에 메모리 누수가 발생할 수 있다.
스마트 포인터란 무엇인가?
자바나 C#같은 경우에 가비지 컬렉터를 통해서 자동으로 메모리를 관리하지만 C++은 사용자가 스스로 메모리를 할당 해제해주면서 관리를 해야한다. 그리고 이 과정을 확실히 처리해주지 못하면 메모리 누수같은 상황이 발생하는데 이와같은 상황을 방지하기 위해 스마트 포인터를 제공한다. 스마트 포인터는 포인터처럼 사용하는 클래스 템플릿으로 메모리르 자동으로 해제해준다. unique_ptr, shared_ptr, weak_ptr 등이 있다.
unique_ptr
하나의 스마트 포인터만이 객체를 가리킬수 있도록 한다.
int* a = new int;
unique_ptr<int> upA1(a); //참조 가능
unique_ptr<int> upA2(a); //위에서 가리키고 있기에 참조 불가능
unique_ptr<int> upA3 = move(a); //move를 통해서 해야함
단 하나의 객체를 가리킬수 있기에 만약 다른 포인터로 참조할려면 move()함수를 이용해야한다.
shared_ptr
여러 개체가 포인터를 공동으로 소유할 수 있는 스마트 포인터이다. 참조하고 있는 포인터의 개수를 통해서 카운트가 0이면 해제되는 방식을 가진다. shared_ptr은 참조수가 늘어날때 마다 카운트가 증가하는데 카운트가 0이 되어야 메모리를 자동해제하기때문에 문제가 발생할 수 있다. 그리고 만약 포인터 2개가 서로를 가리킨다면 영원히 해제할 수 없는 상황을 초례한다.
weak_ptr
shared_ptr이 참조하고 있는 포인터는 참조할 수 있지만 카운트에 추가되자 않는다. 위에 shared_ptr이 서로를 가리키면 영원히 해제할 수 없는 상황을 해결하기 위해 사용한다.
프로그램을 개발함에 있어서 동적으로 메모리를 참조할때 그것을 해제해주는 과정은 매우 중요하다. 가비지컬렉션과 스마트 포인터는 이런 동적 메모리 참조를 자동으로 해제해주는 그러한 시스템이다. 유용하지만 오남은 좋지 않으니 적절히 활용하는 것이 좋겠다.