📢 공부내용에 앞서서
본 게시글은 면접준비 및 자기계발을 목적으로 작성된 게시글입니다
공부한 내용을 토대로 남들에게 설명할 수 있도록 이해하는 과정에 작성한 게시글이니 참고바랍니다
📢 포스트에 앞서서
본 게시글은 러프하게 작성된 게시글로
당장 몇일뒤의 코딩 테스트를 위해 작성된 게시글입니다
추후에 내용을 보충하여 재업로드 할 예정입니다
📖 RAII 개념
- RAII(Resource Acuquisition Is Intialization)는 C++에서 강조되는 디자인 테크닉 중 하나이다
- "자원 획득(Resource Acquisition)은 초기화(Initialization)이다"라고 직역할 수 있는데, 한글로 직역하여도 바로 와닿지는 않을 것이다
좀 더 풀어서 얘기하자면, 자원 획득을 객체 초기화 시에만 하라. 혹은, 자원 획득이 필요한 경우, 자원 획득을 담당하는 클래스를 만들어 그 클래스의 생성자에서만 자원 획득을 하라고 이해하면 좋을 것 같다
- 프로그램을 짜다보면 동적 메모리 할당, 파일 열기, 락 등 자원 획득을 하는 일이 많은데, 이러한 자원 획득을 담당하는 클래스를 만들어 그 클래스의 생성자에서만 자원 획득을 하라고 강조하는 말
- cpp Reference에 따르면, RAII는 자원의 생애주기(life cycle, 자원 획득과 자원 해제)를 객체의 생애(lifetime)에 바인딩시키는 기법이다
📌 RAII의 필요성
- RAII 디자인 패턴은 자원의 생애주기를 객체의 생애에 결합시킨다는 것이다
- 좀 더 풀어서 말하자면, 자원을 사용하고자 하는 상황에서, 생성자에서 자원 획득을, 소멸자에서 자원 해제를 하는 자원관리용 클래스를 만드는 프로그래밍 패턴이다
- 즉 개체의 시작과 끝은 컴퓨터가 알아서 해주는 이점을 활용하여, 자원 관리용 클래스를 만들어 생성자에서 자원 획득을, 소멸자에서 자원 해제를 하게한다면 자원 관리의 문제를 해결할 수 있게 된다
- 이렇게 되면 자원의 생애 주기는 객체의 생애와 결합된다
- 객체의 생애는 런타임이 알아서 잘 관리해준다고 하였다. 즉 그렇기에 앞으로는 객체와 바인딩 된 자원은 런타임이 자동으로 관리할 수 있다
📌 std::unique_ptr
- std::unique_ptr은 스마트 포인터의 일종으로, 동적 메모리 할당된 객체의 소유권을 가진다
- 따라서 std::unique_ptr 변수가 소멸되거나 새로운 객체의 소유권을 얻으면, 기존 객체를 자동 소멸시키고 동적 메모리를 해제한다
- std::unique_ptr은 하나의 동적 할당된 객체를 소유하거나, 동적 할당된 객체들의 배열을 소유할 수 있다
📌 std:shared_ptr
- std::shared_ptr은 스마트 포인터의 일종으로, 동적 메모리 할당된 객체의 소유권을 가진다
- 다만 std::unique_ptr과의 차이점은 메모리 자원의 소유권을 여러 std:shared_ptr이 공유하여 소유할 수 있다는 것이다
- 따라서 하나의 자원의 소유권을 공유한 모든 std::shared_ptr 변수가 소멸되면, 기존 객체는 자동 소멸되고 동적 메모리가 해제된다
- std::shared_ptr은 하나의 동적 할당된 객체를 소유하거나, 동적 할당된 객체들의 배열을 소유할 수 있다
📚 참고출처
얌얌코딩 (게임 개발) : https://youtu.be/D-STWJ24Kcs?si=SchohSwV6LRH3nZv