TIL

C++ 클래스, 메모리, 그리고 참조 시스템

think95592 2026. 4. 30. 19:50

1. 포인터(Pointer) vs 레퍼런스(Reference)

클래스 객체를 가리키거나 전달할 때 사용하는 두 가지 방식입니다.

  • 포인터 (Battery* ptr):
    • 개념: 객체의 '메모리 주소'를 저장하는 변수입니다.
    • 특징: nullptr을 가질 수 있고, 나중에 다른 객체를 가리키도록 바꿀 수 있습니다.
    • 접근: 화살표 연산자(->)를 사용하여 멤버에 접근합니다. (예: ptr->useBattery())
  • 레퍼런스 (Battery& ref):
    • 개념: 기존 객체에 붙이는 '별명(Alias)'입니다.
    • 특징: 선언과 동시에 반드시 초기화해야 하며, 한 번 정해지면 죽을 때까지 그 객체만 가리킵니다.
    • 접근: 일반 객체처럼 점(.) 연산자를 사용합니다. (예: ref.useBattery())

2. 클래스와 포인터/레퍼런스의 결합

  • 동적 할당과 포인터: new 연산자는 객체를 만들고 그 주소를 반환하기 때문에 반드시 포인터로 받아야 합니다. (Battery* b = new Battery();)
  • 매개변수 전달: 클래스 객체는 덩치가 크기 때문에, 함수에 보낼 때 복사본을 만드는 대신 레퍼런스포인터로 전달하여 메모리 효율을 높입니다.
    • void Charge(Battery& b) (권장: 별명을 통해 직접 수정)
    • void Charge(Battery* b) (주소를 넘겨서 수정)

3. 객체지향 핵심 요약 (복습 포함)

  • 캡슐화: private과 Getter/Setter로 데이터를 보호함.
  • 생성자/소멸자: 객체의 시작과 끝을 관리함. (new 시 delete 필수)
  • 다형성 & 추상 클래스:
    • 부모의 순수 가상 함수(= 0)는 자식의 필수 과제.
    • 부모 포인터로 자식 객체들을 일괄 제어 가능.

4. 메모리 할당 방식

  • 정적 할당: Battery b; → 스택 영역, 자동 소멸.
  • 동적 할당: Battery* b = new Battery(); → 힙 영역, delete로 수동 소멸.

💡 오늘의 최종 회고

"포인터는 주소를 들고 다니는 '이정표'이고, 레퍼런스는 '또 다른 이름'이다. 클래스 객체를 다룰 때 이 둘을 적재적소에 사용해야 메모리 낭비 없이 효율적인 게임 로직을 짤 수 있다는 것을 깨달았다. 특히 다형성을 구현할 때 부모 타입의 포인터나 레퍼런스를 사용하는 원리가 이제 명확히 이해된다."