추상 클래스 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++에서는 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 |
댓글