티스토리 뷰

🟩 오늘의 목표

  • 투명 생성자/소멸자의 개념을 이해하고, 소멸자를 언제 직접 작성해야 하는지(Rule of Zero)와 언제 필수인지 구분한다.
  • 기존 포인터(new/delete)의 위험성을 해결하는 스마트 포인터(RAII)의 원리, 종류, 사용법을 완벽하게 익힌다.
  • 오버로딩 vs 오버라이딩의 차이를 명확히 하고, 퀴즈를 통해 발견한 문법적 오개념(참조자, 추상 클래스 등)을 바로잡는다.

 

🟧 1. 소멸자와 메모리 관리 (Modern C++ 국룰)


🟦 소멸자 작성 가이드 (Rule of Zero)

std::string이나 std::vector처럼 스스로 메모리를 관리하는 객체만 사용한다면 소멸자를 만들지 않아도 컴파일러가 만든 '투명 소멸자'가 알아서 처리함을 확인했다. 반면 클래스 내부에서 new로 동적 할당을 직접 했거나 상속 관계에 있을 때는 가상 소멸자(virtual ~Class())가 필수임을 복습했다. 부모 클래스에 가상 소멸자가 없으면 자식 객체 해제 시 메모리 누수가 발생한다는 점을 명확히 이해했다.

 

🟧 2. 스마트 포인터 (Smart Pointer)


🟦 개념 및 종류

자원 획득과 초기화를 동시에 수행하고 수명(Scope)이 다하면 자동으로 해제하는 RAII 원리를 확인했다. 이를 위해 #include <memory> 헤더를 사용했으며, 독점 소유의 unique_ptr과 공유 소유의 shared_ptr 특징을 다음과 같이 정리하여 복습했다.

종류 설명 특징
unique_ptr 독점 소유. 나만 가질 수 있음. 복사 불가(=), 이동만 가능(std::move). 가장 가볍고 빠름.
shared_ptr 공유 소유. 같이 가질 수 있음. 참조 카운트(Ref Count)가 0이 되면 삭제. make_shared 사용 권장.

🟦 스마트 포인터 사용법

make_unique를 이용한 안전한 생성 방식과 소유권 이전(std::move) 기법을 실습했다.

// 1. 생성 (make_unique 권장)
std::unique_ptr<int> p = std::make_unique<int>(10);

// 2. 값 접근 (역참조)
std::cout << *p << std::endl; // 10 출력

// 3. 멤버 접근 (화살표 연산자)
// p->func(); 

// 4. 소유권 이전 (이사)
std::unique_ptr<int> p2 = std::move(p); // p는 껍데기(nullptr)가 됨

 

🟧 3. 핵심 문법 정리 (Quiz 오답 노트)


🟦 오버로딩 vs 오버라이딩 (면접 필기!)

비슷한 이름의 두 개념을 '적재(Load)'와 '재정의(Ride)'의 차이로 구분하여 학습했다.

구분 오버로딩 (Overloading) 오버라이딩 (Overriding)
한글 뜻 중복 정의 (과적) 재정의 (덮어쓰기)
위치 같은 클래스 (또는 같은 스코프) 내 상속 관계 (부모-자식) 사이
함수 이름 같아야 함 같아야 함
매개변수 달라야 함 (개수, 타입 등) 같아야 함 (완전 일치)
작동 시점 컴파일 타임 (정적 바인딩) 런타임 (동적 바인딩, virtual 필요)
// 1. 오버로딩 (함수 이름만 같음)
void func(int a) {}
void func(double b) {} 

// 2. 오버라이딩 (상속에서 덮어쓰기)
class Parent { 
    virtual void cry() { cout << "응애"; } 
};
class Child : public Parent { 
    void cry() override { cout << "으아앙"; } 
};

🟦 메모리 초기화와 참조자 특성

ptr.reset()은 기존 객체를 삭제하고 초기화하지만, ptr.release()는 소유권만 포기하고 메모리는 방치하여 누수 위험이 있음을 확인했다. 또한 참조자(&)가 nullptr이 될 수 없고 선언 시 반드시 초기화가 필요하다는 점을 복습했다. 순수 가상 함수를 포함하여 직접 객체를 생성할 수 없는 추상 클래스의 설계적 목적을 이해했다.

 

🟫 오늘 느낀 점

소멸자 규칙부터 스마트 포인터를 통한 안전한 메모리 관리 기법을 익혔고, 특히 헷갈렸던 오버로딩과 오버라이딩의 차이 및 메모리 관리 함수의 기능을 명확히 구분하게 되었다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 15일차  (1) 2025.12.18
TIL - 14일차  (0) 2025.12.17
TIL - 12일차  (0) 2025.12.12
TIL - 11일차  (1) 2025.12.11
TIL - 10일차  (0) 2025.12.10