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 |
템플릿 타입의 조건 제약 정의 |
컴파일 타임 요구 사항 |
댓글