본문 바로가기
프로그래밍 언어/C++

[C++] 인터페이스(Interface)

by 까망 하르방 2025. 3. 2.
반응형

추상 클래스 vs 인터페이스

• 인터페이스: 지켜야 하는 규칙(순수 가상함수)만 가진 것

• 추상클래스: 지켜야 하는 규칙 + 다른 멤버도 있는 경우

Java 등 대부분의 객체 지향 언어는 abstract, interface 별도 키워드 제공하지만
C++ 에서는 추상 클래스 문법만 존재


[예제]

사람들은(People)은 일반 카메라를 사용

#include <iostream>

class People
{
public:
    void UseCamera(Camera* p) { p->Take(); }
};

class Camera
{
public:
    void Take() { std::cout << "Picture" << std::endl; }
};

int main()
{
    People p;
    
    Camera c;
    p.UseCamera(&c);
}



[예제]

카메라 종류가 다양해지면
기존 UseCamera(Camera* p) 로는 모든 카메라를 담을 수 없다.

#include <iostream>

class People
{
public:
    void UseCamera(Camera* p) { p->Take(); }
};

class Camera
{
public:
    void Take() { std::cout << "Picture" << std::endl; }
};

class HDCamera
{
public:
    void Take() { std::cout << "HD Picture" << std::endl; }
};

class UHDCamera
{
public:
    void Take() { std::cout << "UHD Picture" << std::endl; }
};

int main()
{
    People p;
    
    Camera c;
    p.UseCamera(&c);
    
    HDCamera hdc;
    p.UseCamera(&hdc); // error
    
    UHDCamera uhdc;
    p.UseCamera(&uhdc); // error
}



[예제] Interface 적용

모든 카메라는 ICamera로 부터 파생되도록 규칙을 정한다.

ICamera는 인터페이스로 기반 클래스에 해당된다.

#include <iostream>

struct ICamera // 인터페이스
{
    virtual void Take() = 0;
    virtual ~ICamera() {}
};

class People
{
public:
    void UseCamera(ICamera* p) { p->Take(); }
};

class Camera : public ICamera
{
public:
    void Take() { std::cout << "Picture" << std::endl; }
};

class HDCamera : public ICamera
{
public:
    void Take() { std::cout << "HD Picture" << std::endl; }
};

class UHDCamera : public ICamera
{
public:
    void Take() { std::cout << "UHD Picture" << std::endl; }
};

int main()
{
    People p;

    Camera c;
    p.UseCamera(&c);

    HDCamera hdc;
    p.UseCamera(&hdc);

    UHDCamera uhdc;
    p.UseCamera(&uhdc);
}

 


새로운 카메라가 출시 되어도
기존 함수 변경 없이 인터페이스를 상속 받으면 된다.
→ OCP (Open - Close Principle)

 


✔️ 실제 카메라를 먼저 만들기보다
 카메라 제작자와 사용자 사이 규칙(ICamera)을 먼저 설계 해야 한다.

 


✔️ 인터페이스에는 class 보다 struct 사용하는 경우가 많다.
→ 인터페이스 역할상 private 없이 public


✔️ 강한 결합 vs 약한 결합

📍 void UseCamera(Camera* p) { ... }
• 강한 결합 (tightly coupling)
• 교체가 어려우며 확장성 없는 경직된 디자인

📍 void UseCamera(ICamera* p) { ... }
• 약한 결합(looselty coupling, 느슨한 결합)
• 확장/교체 가능한 유연한 디자인
 ex) 인터페이스

 

 

📌 [C/C++] struct 차이 비교

 

[C/C++] struct 차이 비교

C++에서는 Class가 있지만 stuct 형태도 사용 가능하다. C에서 사용하던 형태와 C++ 차이가 존재한다.  [C] StructC언어 구조체 안에는 변수만 둘 수 있다.그래서 구조체 함수를 외부에 두어야 한다. [C

zoosso.tistory.com

 

📌 [C++] 가상 함수 (virtual funciton)

 

[C++] 가상 함수 (virtual funciton)

가상 멤버 함수 (virtual function)동적 바인딩을 위해 사용class A{public: virtual void sub(void);};  [예제] 함수 재정의(overriding) 주의사항#include class Animal{public: void Cry() { std::cout Cry(); // ??? -> Dog? Animal?}Q) p-

zoosso.tistory.com

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] 다중 상속 (multiple inheritance)  (2) 2025.03.04
[C++] dynamic_cast  (1) 2025.03.03
[C++] object Slicing  (1) 2025.03.01
[C++] RTTI (Run-Time Type Information)  (3) 2025.02.28
[C++] 가상함수와 디폴트 파라미터  (1) 2025.02.27

댓글