CRTP를 사용한 믹스인
컴파일 시간에 동작 조합하기
CRTP를 사용한 믹스인은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
믹스인이란?
믹스인은 클래스에 조합할 수 있는 작고 재사용 가능한 동작 단위입니다. CRTP를 사용하면 믹스인이 컴파일 시점에 기능을 추가하면서도 호스트 클래스의 기능을 호출할 수 있습니다.
간단한 믹스인
이 믹스인은 호스트가 value()를 제공한다는 전제로 print_twice 메서드를 추가합니다.
#include <iostream>
template <typename T>
struct PrintTwice {
void print_twice() const {
auto v = static_cast<const T*>(this)->value();
std::cout << v << " " << v << "\n";
}
};
struct Box : PrintTwice<Box> {
int value() const { return 7; }
};
int main() {
Box{}.print_twice();
return 0;
}여러 믹스인 조합
여러 CRTP 믹스인을 한 번에 상속하여 독립적인 동작을 하나의 클래스에 차례로 추가할 수 있습니다.
#include <iostream>
template <typename T>
struct Loggable {
void log() const { std::cout << "log: " << static_cast<const T*>(this)->id() << "\n"; }
};
template <typename T>
struct Resettable {
void reset() { static_cast<T*>(this)->set(0); }
};
struct Device : Loggable<Device>, Resettable<Device> {
int v = 5;
int id() const { return v; }
void set(int x) { v = x; }
};
int main() {
Device d;
d.log();
d.reset();
d.log();
return 0;
}믹스인은 상태도 추가함
믹스인은 자체 데이터 멤버를 가질 수 있으며, 이 멤버는 조합된 객체 배치의 일부가 됩니다.
#include <iostream>
template <typename T>
struct Tagged {
int tag = 0;
void set_tag(int t) { tag = t; }
int get_tag() const { return tag; }
};
struct Item : Tagged<Item> {
const char* name = "item";
};
int main() {
Item it;
it.set_tag(42);
std::cout << it.name << " " << it.get_tag() << "\n";
return 0;
}믹스인과 일반 상속 비교
CRTP 믹스인은 기반 클래스가 파생 클래스로 내려가 호출할 수 있다는 점에서 일반 상속과 다릅니다. 일반적인 기반 클래스는 가상 함수를 사용하지 않고는 파생 형식에만 존재하는 메서드를 호출할 수 없습니다.
정책 기반 설계
믹스인은 정책 기반 설계를 가능하게 합니다. std::vector가 할당자 정책을 받는 방식과 비슷하게, 어떤 믹스인을 상속할지 선택하여 컴파일 시점에 동작을 결정합니다.
순서와 배치
믹스인을 여러 개 쌓을 때 기반 클래스의 순서는 생성 순서와 객체 배치에 영향을 줍니다. 올바르게 동작하는 데 순서가 중요하지 않도록 믹스인을 서로 독립적으로 유지하십시오.
- 기반 클래스의 선언 순서대로 생성됩니다
- 서로 의존하는 믹스인은 피하십시오
동등성 믹스인 추가
여기서는 호스트의 동등성 비교를 바탕으로 믹스인이 operator!=를 만들어 냅니다.
#include <iostream>
template <typename T>
struct EqualityMixin {
friend bool operator!=(const T& a, const T& b) { return !(a == b); }
};
struct P : EqualityMixin<P> {
int x;
P(int v) : x(v) {}
friend bool operator==(const P& a, const P& b) { return a.x == b.x; }
};
int main() {
std::cout << (P(1) != P(2)) << "\n";
return 0;
}조건부 믹스인
상속과 std::conditional을 결합하여 조건이 충족될 때만 믹스인을 포함할 수 있습니다. 이때 실제 믹스인과 빈 믹인 중 하나를 선택합니다.
빈 기반 클래스 최적화
데이터 멤버를 보유하지 않는 믹스인은 빈 기반 클래스 최적화의 이점을 얻습니다. 컴파일러가 믹스인에 추가 공간을 전혀 할당하지 않으므로 상태가 없는 믹스인을 여러 개 쌓아도 크기 측면에서는 비용이 없습니다.
#include <iostream>
template <typename T>
struct A {};
template <typename T>
struct B {};
struct C : A<C>, B<C> {
int x;
};
int main() {
std::cout << (sizeof(C) == sizeof(int)) << "\n";
return 0;
}믹스인을 사용할 때
여러 클래스에 동일한 독립적 동작(기록, 횟수 세기, 비교)이 필요할 때 믹스인이 특히 유용합니다. 각 동작을 한 곳에 유지하면서 실행 시간 비용 없이 조합할 수 있습니다.
빠른 확인
CRTP 믹스인에 대한 이해도를 확인하십시오.
요약
CRTP로 믹스인을 만드는 방법을 배웠습니다.
- 믹스인은 컴파일 시점에 서로 독립적인 동작을 조합합니다
- 호스트로 내려가 호출할 수 있고 상태를 보유할 수도 있습니다
- 상태가 없는 믹스인은 빈 기반 클래스 최적화 덕분에 추가 비용이 없습니다
- 기록, 비교, 횟수 세기 정책에 적합합니다
자주 묻는 질문
“CRTP를 사용한 믹스인” 강의는 무료인가요?
네 — “CRTP를 사용한 믹스인” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“CRTP를 사용한 믹스인”에서 뭘 배우나요?
컴파일 시간에 동작 조합하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“CRTP를 사용한 믹스인” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CRTP 관용구
- 정적 다형성
- CRTP를 사용한 믹스인
- CRTP를 사용할 시점