override, final, = default, = delete: 의도를 코드에 남기기
11강. override, final, = default, = delete: 의도를 코드에 남기기
이번 강의에서 해결할 문제
부모 함수 이름을 잘못 적어 재정의했다고 착각하거나, 복사하면 안 되는 자원 관리 객체가 조용히 복사될 수 있습니다. 주석만으로 의도를 남기면 컴파일러는 규칙 위반을 막아 주지 못합니다.
학습 목표
override와final이 상속 의도를 검사하는 방식을 설명합니다.= default로 기본 동작을 명시합니다.= delete로 허용하지 않을 연산을 컴파일 단계에서 막습니다.
먼저 알아야 할 핵심 개념
override는 부모의 가상 함수를 정확히 재정의한다는 선언입니다. 시그니처가 다르면 컴파일 오류가 납니다. final은 더 이상 재정의하거나 상속하지 못하게 합니다. = default는 컴파일러가 제공하는 기본 구현을 의도적으로 사용한다는 뜻이고 = delete는 해당 호출을 금지합니다.
가장 작은 실행 가능한 예제
#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();
}
핵심 코드 줄별 설명
- 부모 소멸자는 다형적 삭제를 위해 가상이며 기본 구현을 사용합니다.
update() const = 0은 자식이 구현해야 할 순수 가상 함수입니다.Player final은 더 파생된 클래스를 만들지 않겠다는 계약입니다.- 복사 생성자와 복사 대입을 삭제해 복사 코드를 컴파일 단계에서 막습니다.
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개
override가 주석보다 강한 이유는 무엇인가요?= default와 아무 선언도 하지 않는 것의 의도 전달 차이는 무엇인가요?- 복사를 삭제하기 전에 객체가 값 타입인지 확인해야 하는 이유는 무엇인가요?
핵심 요약
클래스의 허용·금지 동작을 키워드로 기록하면 컴파일러가 계약을 검사합니다. override, final, default, delete는 설계 판단을 대신하지 않지만 판단을 코드에 고정합니다.
다음 강의 연결
12강. string과 string_view에서 문자열 소유와 읽기 전용 관찰을 타입으로 구분합니다.
override, final, = default, = delete: 의도를 코드에 남기기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.