[OOP/C++] RAII와 동적메모리 자원 관리

신지한·2024년 5월 17일

면접준비

목록 보기
6/9
post-thumbnail

📢 공부내용에 앞서서

본 게시글은 면접준비 및 자기계발을 목적으로 작성된 게시글입니다
공부한 내용을 토대로 남들에게 설명할 수 있도록 이해하는 과정에 작성한 게시글이니 참고바랍니다

📢 포스트에 앞서서

본 게시글은 러프하게 작성된 게시글로 
당장 몇일뒤의 코딩 테스트를 위해 작성된 게시글입니다
추후에 내용을 보충하여 재업로드 할 예정입니다

📖 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

profile
게임 개발자

0개의 댓글