본문으로 건너뛰기
모던 C++LESSON 11

override, final, = default, = delete: 의도를 코드에 남기기

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

11강. override, final, = default, = delete: 의도를 코드에 남기기

이번 강의에서 해결할 문제​

부모 함수 이름을 잘못 적어 재정의했다고 착각하거나, 복사하면 안 되는 자원 관리 객체가 조용히 복사될 수 있습니다. 주석만으로 의도를 남기면 컴파일러는 규칙 위반을 막아 주지 못합니다.

학습 목표​

  • override와 final이 상속 의도를 검사하는 방식을 설명합니다.
  • = default로 기본 동작을 명시합니다.
  • = delete로 허용하지 않을 연산을 컴파일 단계에서 막습니다.

먼저 알아야 할 핵심 개념​

override는 부모의 가상 함수를 정확히 재정의한다는 선언입니다. 시그니처가 다르면 컴파일 오류가 납니다. final은 더 이상 재정의하거나 상속하지 못하게 합니다. = default는 컴파일러가 제공하는 기본 구현을 의도적으로 사용한다는 뜻이고 = delete는 해당 호출을 금지합니다.

가장 작은 실행 가능한 예제​

class_intent.cpp
#include <iostream>

class Actor {
public:
virtual ~Actor() = default;
virtual void update() const = 0;
};

class Player final : public Actor {
public:
Player() = default;
Player(const Player&) = delete;
Player& operator=(const Player&) = delete;

void update() const override {
std::cout << "player update\n";
}
};

int main() {
Player player;
player.update();
}

핵심 코드 줄별 설명​

  1. 부모 소멸자는 다형적 삭제를 위해 가상이며 기본 구현을 사용합니다.
  2. update() const = 0은 자식이 구현해야 할 순수 가상 함수입니다.
  3. Player final은 더 파생된 클래스를 만들지 않겠다는 계약입니다.
  4. 복사 생성자와 복사 대입을 삭제해 복사 코드를 컴파일 단계에서 막습니다.
  5. override는 함수 이름·매개변수·const가 부모 선언과 맞는지 검사합니다.

실행 결과와 값 변화​

player update

update()에서 const를 빼면 부모 함수와 시그니처가 달라져 override 오류가 발생합니다. 이 실패가 런타임의 잘못된 동적 호출보다 훨씬 이른 피드백입니다.

단계별 실습​

실습 목표​

적 AI 인터페이스와 복사할 수 없는 구현 클래스를 작성합니다.

시작 전 상태와 실행 방법​

EnemyBehavior 부모와 PatrolBehavior 자식을 새 C++17 파일에 만듭니다.

1단계: 최소 코드 작성​

부모에 가상 run() const를 선언하고 자식에서 override합니다.

2단계: 값 또는 조건을 바꿔 결과 비교​

자식의 const를 잠시 제거해 컴파일러가 오류를 찾는지 확인합니다.

3단계: 작은 기능 확장​

PatrolBehavior를 final로 만들고 복사 생성자를 삭제합니다.

4단계: 스스로 해결하기​

이 객체가 정말 복사 불가능해야 하는지 근거를 적고, 값 객체라면 삭제 대신 기본 복사를 유지하세요.

막혔을 때​

override 오류가 나면 반환형만 보지 말고 매개변수, const, 참조 한정자까지 부모와 비교합니다. 기반 클래스를 포인터로 삭제한다면 가상 소멸자가 있는지 확인합니다.

흔한 실수와 해결 방법​

  • 모든 클래스를 final로 선언: 확장을 막을 실제 설계 이유가 있을 때 사용합니다.
  • 복사 금지 이유가 없음: 값 타입은 자연스러운 복사가 더 간단할 수 있습니다.
  • override 생략: 가상 함수 재정의에는 항상 붙여 컴파일러 검사를 받습니다.

게임 개발 연결​

입력 처리나 AI 전략 인터페이스를 구현할 때 override가 엔진 콜백 시그니처 변경과 오타를 잡습니다. Unreal 매크로가 붙은 클래스도 일반 C++의 재정의 규칙을 따르므로 override를 함께 사용합니다.

이해 점검 질문 3개​

  1. override가 주석보다 강한 이유는 무엇인가요?
  2. = default와 아무 선언도 하지 않는 것의 의도 전달 차이는 무엇인가요?
  3. 복사를 삭제하기 전에 객체가 값 타입인지 확인해야 하는 이유는 무엇인가요?

핵심 요약​

클래스의 허용·금지 동작을 키워드로 기록하면 컴파일러가 계약을 검사합니다. override, final, default, delete는 설계 판단을 대신하지 않지만 판단을 코드에 고정합니다.

다음 강의 연결​

12강. string과 string_view에서 문자열 소유와 읽기 전용 관찰을 타입으로 구분합니다.

MINI QUIZ

override, final, = default, = delete: 의도를 코드에 남기기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“override, final, = default, = delete: 의도를 코드에 남기기” 코드 리뷰에서 동작 원리와 일치하는 설명은 무엇인가요?
  2. 문제 2“override, final, = default, = delete: 의도를 코드에 남기기”의 작업 기준으로 ‘복사 금지 이유가 없음’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

11강. override, final, = default, = delete: 의도를 코드에 남기기 미완료 상태