[C++] 추상 클래스 (인터페이스)

seunghyun·2023년 8월 4일
0

순수 가상 함수 (pure virtual function)

순수 가상 함수는 함수의 코드가 없고 선언만 있는 가상 함수를 일컫는다.
구현부는 없고 그냥 인터페이스만 전달하는 용도로 사용하고 싶을 때 쓰는 함수이다.
'날 상속받는 애는 구현해라!' 라는 강제성이다

virtual void VAttack() = 0; // 예전 문법
virtual void VAttack2() abstract; // Modern C++ 버전 ⭐️⭐️⭐️⭐️⭐️

기본 클래스에 작성된 가상함수🌷는 실행할 목적보다는,
파생 클래스에서 재정의하여 구현할 함수를 알려주는 인터페이스의 역할을 한다.
그리고 파생 클래스에서 가상 함수를 재정의 하면, Shape 클래스의 draw() 함수처럼, 동적 바인딩에 의해 기본 클래스의 가상 함수는 거의 실행되지 않는다.
따라서 실행이 목적이 아니라면, 굳이 기본 클래스의 가상 함수에 코드를 작성할 필요가 없다.

추상 클래스

순수 가상 함수가 1개 이상 포함되면 바로 추상 클래스로 간주한다.

  • 영원히 직접적으로는 객체를 만들 수 없게 된다.
  • 상속받아서 추상 클래스를 구현. 재정의해야 인스턴스화 할 수 있다.

최소 하나의 순수 가상 함수를 가진 클래스를 추상 클래스라고 말한다.

class Shape{ // Shape 은 추상 클래스
public:
	void paint(){
		draw(); // 순수 가상 함수를 호출할 수 있다.
	}
	virtual void draw() = 0; // 순수 가상 함수
}

⚠️ 추상 클래스는 실행 코드가 없는 순수 가상 함수를 가지고 있기 때문에, 불완전한 클래스이다. 그러므로 응용프로그램에서 추상 클래스의 인스턴스(객체)를 생성할 수 없다

Shape shape; // ⛔️ 컴파일 오류 error C2259: 'Shape' : 추상 클래스를 인스턴스화할 수 없습니다.
Shape *p = new Shape(); // ⛔️ 컴파일 오류

그러나! 다음과 같이 추상 클래스에 대한 포인터의 선언은 문제되지 않는다. 🙆🏻‍♀️🙆🏻

Shape *p; 

추상 클래스의 목적

추상 클래스는 인스턴스를 생성할 목적으로 만들지 않고, 상속을 위한 기본 클래스로 활용하는 것이 목적이다.
또한 순수 가상 함수를 통해 파생 클래스가 구현할 함수의 원형을 보여주는 인터페이스의 역할을 한다.

추상 클래스의 모든 멤버 함수를 순수 가상 함수로 선언할 필요는 없다.
일반적으로 추상 클래스는 여러 멤버 변수와 여러 멤버 함수를 구현하고 나름대로의 기능을 갖춘다.

다만, 파생 클래스에서 구현해야 할 함수만 순수 가상 함수로 선언한다.

추상 클래스 상속

🔖 추상 클래스를 상속받는 파생 클래스는 자동으로 추상 클래스가 된다. 순수 가상 함수를 그대로 상속받기 때문이다.

⚠️ 즉, 추상 클래스를 상속받는 파생 클래스도 (구현을 하지 않았다면) 객체를 생성할 수 없다!

추상 클래스의 구현

🔖 추상 클래스의 구현이란, 파생 클래스에 추상 클래스의 순수 가상 함수의 코드를 작성함을 뜻한다.

⚠️ 파생 클래스가 온전한 클래스가 되려면 상속받은 추상 클래스의 모든 순수 가상 함수를 오버라이딩하여 구현하여야 한다.

추상 클래스의 용도

추상 클래스를 상속받는 파생 클래스는 그 목적에 따라 순수 가상 함수를 다양하게 구현한다.

추상 클래스를 책의 목차에 비유하면, 파생 클래스는 목차에 따라 작성된 책과 같다.
목차를 잡아 놓고 책을 쓰면 방향이 흐트러지지 않는 것처럼,
추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다.

  • 추상 클래스로 기본 방향을 잡아놓고 파생 클래스를 목적에 따라 구현하면 작업이 쉬워진다.

또한 추상 클래스는 계층적 상속 관계를 가진 클래스들의 구조를 만들 때 적합하다.

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기