티스토리 뷰
추상 클래스는 순수 가상함수가 한개 이상 있는 클래스이다.
추상 클래스이기 때문에 앞서 설명한 것처럼 자기 자신의 객체를 생성할 수 없게 막아둔다.
파생 클래스 설계자에게 특정함수를 반드시 만들라고 지시하기 위해서 사용한다.
java, C#의 인터페이스와 같은 역할이다.
이런 추상 클래스는 강한 결합을 약한 결합으로 바꾸는데 중요한 역할을 한다.
class Camera
{
public:
void Take() { std::cout << "Take Picture" << std::endl; }
};
class HDCamera
{
public:
void Take() { std::cout << "Take HD Picture" << std::endl; }
};
class People
{
public:
void UseCamera(Camera* p) { p->Take(); }
void UseCamera(HDCamera* p) { p->Take(); }
};
다음을 보면, Camera의 종류가 생길때 마다 People이라는 클래스는 UseCamera 함수를 새로 만들어줘야 한다.
이런 것을 보고 우리는 강한 결합이라고 한다.
강한결합(tightly coupling)
하나의 클래스가 다른 클래스 사용시 클래스 이름을 직접 사용하는 것.
교체가 불가능한 경직된 디자인.
이는 객체지향 프로그래밍에서 지양해야하는 결합이다.
이를 인터페이스로 약한 결합으로 바꿔주는 것은 다음 코드와 같다.
struct ICamera
{
virtual void Take() = 0;
virtual ~ICamera() {}
};
// 카메라는 없지만 규칙이 있다. 규칙대로만 사용하면 된다.
class People
{
public:
void UseCamera(ICamera* p) { p->Take(); }
};
// 이제 모든 카메라 제작자는 규칙대로만 만들면 된다.
class Camera : public ICamera
{
public:
void Take() override { std::cout << "Take Picture" << std::endl; }
};
class HDCamera : public ICamera
{
public:
void Take() override { std::cout << "Take HD Picture" << std::endl; }
};
class UHDCamera : public ICamera
{
public:
void Take() override { std::cout << "Take UHD Picture" << std::endl; }
};
위의 코드에서 ICamera라는 인터페이스를 통해서 Camera라는 클래스가 생성할때, 필요한 동작을 정의 했다.
그리고 People이라는 클래스는 인터페이스를 인자로 받기 때문에 어떠한 카메라도 동일한 함수를 통해서 처리할 수 있다.
그래서 우리는 새로운 Camera를 생성할 때, 다음과 같은 형식으로 추가하면 된다.
여기서 우리는 객체지향의 OCP에 대해서 알 수 있다.
- 기능확장에 열려있고(Open, 클래스/모듈이 추가)
- 코드 수정에는 닫혀있고(Close, 기존코드는 수정되지 않게)
- 만들어야 하는 원칙(Principle)
Camera생성시 지켜야하는 규칙
모든 카메라는 Take()함수가 있어야 한다. 또한 ICamera인터페이스를 구현해야 한다.
약한 결합(Loosely Coupling)
하나의 클래스가 다른 클래스 사용시 규칙을 담은 추상 클래스(인터페이스)를 사용해서 접근하는 것.
교체 가능한 유연한 디자인의 핵심
인터페이스: 지켜야 하는 규칙(순수 가상함수)만 있는 경우
추상클래스: 지켜야 하는 규칙(순수 가상함수)만 있는 경우 + 다른 멤버(데이터, 함수 등..)
'Programming_language > C, C++' 카테고리의 다른 글
[C++ Design Pattern] 5. Template Method Pattern (0) | 2021.11.13 |
---|---|
[C++ Design Pattern] 3. 가상함수 (0) | 2021.11.13 |
[C++ Design Pattern] 2. upcasting (0) | 2021.11.13 |
[C++ Design Pattern] 1. 생성자 (0) | 2021.11.13 |
- Total
- Today
- Yesterday
- 리액트
- 프론트엔드
- Front
- Data Engineering
- feign client
- broker
- React
- Firebase
- zookeeper
- apache kafka
- NextJS
- Container
- centos
- Linux
- consumer
- frontend
- logback
- KAFKA
- OS
- docker
- spring boot
- rhel
- JPA
- K8S
- cs
- API
- Producer
- Java
- spring
- apache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |