0Pricing
C++ Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CRTP 관용구
  2. 정적 다형성
  3. CRTP를 사용한 믹스인
  4. CRTP를 사용할 시점
← C++ Academy(으)로 돌아가기