고성능 게임 엔진이나 대규모 시스템 개발을 위한 C++의 정수, 가상 상속과 연산자 오버로딩을 실무적인 시각으로 정리합니다.
1. 가상 상속 (Virtual Inheritance)
교과서적 정의: 다이아몬드 상속 문제의 해결사
다중 상속 체계에서 발생하는 '다이아몬드 문제(Diamond Problem)'를 해결하기 위한 기법입니다. 최하위 자식 클래스 인스턴스 내부에 베이스 클래스의 멤버가 중복 생성되는 것을 방지합니다.
기술 디테일: vbptr (Virtual Base Pointer)
상속 시 virtual 키워드를 사용하면, 컴파일러는 객체 내부에 vbptr을 생성합니다. 이를 통해 최상위 부모 객체의 오프셋을 계산하여 단 하나의 인스턴스만 공유하도록 제어합니다.
실무적 관점 및 모바일 환경 고려사항
- 메모리 및 성능 오버헤드: vbptr을 통한 간접 참조(Indirection)가 발생하며, 이는 일반 상속보다 미세하게 느립니다.
- 캐시 효율성: 모바일 환경(Vulkan 등)에서는 메모리 레이아웃의 연속성이 중요합니다. 가상 상속은 캐시 미스 가능성을 높일 수 있습니다.
- 설계 대안: 현대 아키텍처에서는 다중 상속 대신 컴포넌트 기반 설계(Composition)를 권장합니다.
2. 연산자 오버로딩 (Operator Overloading)
교과서적 정의: 사용자 정의 타입의 연산 규칙
사용자 정의 클래스에서도 +, -, * 등의 연산자를 기본 자료형처럼 직관적으로 사용할 수 있게 재정의하는 기능입니다.
| 구분 | 멤버 함수 오버로딩 | 전역 함수 오버로딩 |
|---|---|---|
| 주체 | 클래스 내부 정의 | 클래스 외부 정의 |
| 특징 | 왼쪽 피연산자가 클래스여야 함 | 피연산자 타입 대칭성 확보 가능 |
| 권장 | 상태 변경 연산 (+= 등) |
교환 법칙이 필요한 연산 (f * V) |
반드시 '멤버 함수'여야 하는 연산자
C++ 표준에 의해 아래 연산자들은 반드시 멤버 함수로만 오버로딩해야 합니다.
- 대입 연산자 (
=) - 함수 호출 연산자 (
()) - 배열 인덱스 연산자 (
[]) - 멤버 접근 연산자 (
->)
🔍 Senior's Check-list
- 가상 상속: 구조적 모호함을 해결해야 하는 최후의 보루로만 사용합니다.
- 연산자 오버로딩: 가독성에는 좋으나, 의미가 불분명한 오버로딩은 지양합니다.
- 성능: 불필요한 임시 객체 생성을 막기 위해 복사 생략(Copy Elision)을 고려하십시오.
'C++ 공부' 카테고리의 다른 글
| [C++/자료구조] 핵심 정렬 알고리즘 및 트리 구조 정리 (모바일 최적화 관점) (0) | 2026.05.27 |
|---|---|
| [C++] 와이드 문자 타입 wchar_t 핵심 정리 (0) | 2026.05.11 |
| [C++ Study] 가상 함수부터 인터페이스까지: 객체지향의 핵심 정리 (0) | 2026.04.24 |
| [C++ Study] 가상 함수와 V-Table: 동적 바인딩의 내부 메커니즘 (0) | 2026.04.19 |
| [C++ Study] 객체지향 설계의 핵심: 관계 정의와 다형성 (Is-A, Has-A, Casting) (0) | 2026.04.18 |