본문 바로가기
언어/C, C++

Interface vs concept

by minhyeok.lee 2025. 6. 4.
반응형

Interface와 concept 비교

C++의 interface(추상 클래스 기반)와 concept(C++20부터 도입된 템플릿 제약 방식)은 둘 다 다형성과 제약 조건 구현에 사용되지만, 목적, 사용 시점, 처리 방식이 완전히 다름


✅ 기본 개념 비교

항목 interface (추상 클래스) concept (C++20)
정의 방식 순수 가상 함수(pure virtual function)를 가진 클래스 template 타입에 대한 조건을 정의하는 선언식 구문
사용 목적 런타임 다형성 (Virtual Dispatch) 컴파일타임 제약 (Type Constraints)
다형성 OOP 기반 다형성 (virtual 함수 호출) 정적 다형성 (template 기반, 컴파일 시 결정)
상속 필요 여부 상속을 통해 구현 클래스가 interface를 따름 상속 불필요. 타입이 concept 조건을 만족하면 됨
가상 함수 오버헤드 있음 (vtable 통해 동적 디스패치) 없음 (정적 바인딩으로 컴파일 타임 결정)
런타임 비용 가상 함수 호출, RTTI 비용 발생 없음 (인라인 최적화 가능)
사용 가능 조건 클래스 기반 타입만 적용 가능 템플릿이 지원되는 모든 타입에 적용 가능 (클래스, struct, int 등)

✅ 코드 비교

① Interface 예시 (추상 클래스 기반)

class IReceiver {
public:
    virtual void start() = 0;
    virtual int read() = 0;
    virtual ~IReceiver() = default;
};

class UartReceiver : public IReceiver {
public:
    void start() override { /* ... */ }
    int read() override { return 42; }
};

void process(IReceiver* recv) {
    recv->start();
    std::cout << recv->read();
}
  • 다형성 → 런타임 결정
  • vtable 통한 간접 호출

② Concept 예시 (정적 제약 기반)

template<typename T>
concept Receiver = requires(T t) {
    { t.start() } -> std::same_as<void>;
    { t.read() } -> std::convertible_to<int>;
};

class UartReceiver {
public:
    void start() { /* ... */ }
    int read() { return 42; }
};

template<Receiver T>
void process(T& recv) {
    recv.start();
    std::cout << recv.read();
}
  • 다형성 → 컴파일타임 결정
  • 인라인 최적화 가능, 성능 좋음

✅ 사용 시점 비교

상황 interface (추상 클래스) concept (템플릿 제약)
런타임에 타입 결정 필요할 때 ✅ 적합 ❌ 불가능 (컴파일 타임 결정)
다양한 객체를 동일한 인터페이스로 관리할 때 ✅ 적합 ❌ 복잡함 (std::variant 등 필요)
속도가 중요하고, 컴파일타임 확인이 유리할 때 ❌ 가상함수 오버헤드 있음 ✅ 매우 적합
동적 메모리나 플러그인 구조가 필요할 때 ✅ 유리 ❌ 정적 바인딩이라 부적합

✅ 주요 차이 요약

항목 Interface Concept
타입 제약 표현 클래스 상속 + virtual requires 또는 template<Concept T>
유연성 런타임에 자유롭게 객체 선택 가능 컴파일 타임에 타입 고정
런타임 오버헤드 있음 (vtable, RTTI) 없음 (성능 최적화 용이)
추상화 수준 객체 지향 프로그래밍 제네릭 프로그래밍
에러 메시지 런타임까지 가지 않아 확인 어려움 컴파일 타임에서 친절한 에러 제공
활용 예 드라이버, 플러그인, 상태머신 등 연산 가능성 검사, 범용 함수 조건 등

✅ 사용 시기

상황/요구 추천 방식
다양한 구현체를 런타임에 교체하거나 다룰 때 interface (추상 클래스)
속도, 타입 안전성, 컴파일 타임 최적화가 중요할 때 concept (C++20 이상)
템플릿의 조건을 명확하게 정의하고 싶은 경우 concept

✅ 참고 요약

개념 용도 방식
Interface 객체의 공통 동작 정의 클래스 상속, 가상 함수
Concept 템플릿 타입의 조건 제약 정의 컴파일 타임 요구 사항
반응형

'언어 > C, C++' 카테고리의 다른 글

[c++] concept  (0) 2025.06.03
메모리 누수  (0) 2025.06.02
[C++] 인터페이스(Interface) 정리  (0) 2025.05.31
DI(Dependency Injection), DIP(Dependency Inversion Principle)  (0) 2025.05.22
c, c++ 임베디드 설계 비교  (1) 2025.05.21

댓글