추상 클래스와 인터페이스

보물창고·2022년 8월 20일
0

c++ basic 코드누리

목록 보기
37/50

순수 가상함수

: virtual 함수인데, 구현부가 없고,
1. 선언부가 = 0으로 끝나는 함수를 말함.
2. 또는 선언만 하고 뒤에다가 abstract 키워드를 붙이는 경우.

  • 구현부가 없으니 완전한 형태가 아님.

추상 클래스

: 순수 가상함수가 한개 이상 있는 클래스

추상 클래스의 특징

  • 객체 생성 불가함.
  • 포인터 변수 선언 및 할당은 가능함.
  • 추상으로부터 파생한 클래스도 마찬가지로, 선언된 것이나
    다름 없으므로, 구현부를 제공해야 함.

파생클래스에서는

: 기반 클래스의 순수가상함수의 구현부 제공하지 않으면, 역시 추상 클래스로
받아들이므로,
-> 파생클래스도 불완전한 형태임.

가장 중요! 😈설계 의도

: 파생 클래스에게 특정 멤버 함수를 반드시 만들어야 함을 명시함.

problem

: Shape 추상 클래스를 만들고, Rect, Triangle 파생클래스로 상속받아서,
Draw 함수 호출까지 해서 Rect와 Triangle를 그리자.


인터페이스

: 추상클래스를 인터페이스라고도 함.

  • 개방 폐쇄의 법칙
    : 기능 확장 및 변경가능한 것에는 열려 있고,
    고정적인 것은 닫혀 있어야 함.

problem

  • 예제
    : Peaple 클래스와 Camera 클래스가 있음.
  • Peaple클래스는 useCamera 함수를 통해 인자로 들어오는 Camera.take 함수를
    호출해 사진을 찍음.
  • 그러다가 HDCamera 가 출시됨.
  • Peaple이 HDCamera도 useCamera 하도록 만들어라
  • 힌트 : 인터페이스 클래스를 만들어라

가) 인터페이스 개념 사용하지 않을 때의 코드
나) 인터페이스 개념 사용할 때의 코드

people p;
Camera c;
p.useCam(&c1); // useCam 은 함수에서 cl->take()를 호출함.

그러면 hdCam의 take를 호출하기 위한 함수를 또 만들 것인가???
-> 변경되는 코드는 열려있게 만들자.

  • 인터페이스화 하자.
    1) take 함수를 인터페이스 클래스로 만들자.
    2) 새롭게 추가되는 기능들은 상속 받아서 사용
    3) people 클래스에서는 인자를 인터페이스로 받아야 함.

  • problem
    : 위의 내용을 토대로 코드를 구현하라.

가장 중요! 😈설계 의도

: 파생 클래스에게 특정 멤버 함수를 반드시 만들어야 함을 명시함.

  • 아래의 코드를 보면, ICamera 클래스를 순수가상함수로 만들었기 때문에,
    ICamera를 상속하는 모든 클래스는 반드시! take 함수를 재정의해야 한다.
    재정의 하지 않으면 컴파일 에러 발생한다.
    아래의 코드에서 재정의하지 말아보자...
  • 코드
class ICamera
{
public:
	virtual void take() const = 0;
};

class Peaple
{
public : 
	void useCamera(const ICamera& obj)
	{
		obj.take();
	}
};


class Camera : public ICamera
{
public : 
	virtual void take() const override 
	{
		cout << "camera" << endl;
	}
};

class HDCamera : public ICamera
{
public : 
	virtual void take() const override {
		cout << "HDCamera" << endl;
	}
};

int main()
{
	Peaple p;
	Camera cc;
	p.useCamera(cc);

	HDCamera hdC;
	p.useCamera(hdC);


}
  • 파생클래스에서 순수가상 함수를 재정의하지 않으면, 불완전한 클래스이기 때문에 오류 발생하는 것을 확인할 수 있따.
profile
🔥🔥🔥

0개의 댓글