본문 바로가기
C++

[C++] 추상 클래스(Abstract Class)와 인터페이스(Interface)의 차이점

728x90
반응형

추상 클래스란?

    - 추상클래스는 순수가상함수를 포함한 클래스입니다. 순수가상함수를 포함하고 있기 때문에 인스턴스화 즉, 객체를 생성할 수 없는 클래스입니다. 추상 클래스는 파생클래스에게 상속되는 형태로 사용됩니다. 

 

인터페이스란?

    - 인터페이스는 구현없이 정의만을 해놓은 클래스입니다. JAVA와 C#은 Interface기능을 별도로 제공하지만 C++은 제공하지 않기에 추상 클래스를 순수 가상함수만으로 선언하여 Interface처럼 사용합니다.

 

인터페이스가 필요한 이유는?

    - 위에 설명만 들을 경우 굳이 추상 클래스와 인터페이스를 분류해놓을 필요가 없어 보이지만, 인터페이스의 진가는 다중 상속을할 때 나타납니다.

 

#include <iostream>

using namespace std;

class AbstractA {
public:
	void Print() { cout << "AbstractA" << endl; };
};

class AbstractB {
public:
	void Print() { cout << "AbstractB" << endl; };
};

class Child : public AbstractA, AbstractB {
public:
};

int main()
{
	Child child;

	child.Print(); // Error

	return 0;
}

위와같이 두 개의 클래스를 다중상속받았을 때 함수명이 겹칠경우 둘 중 어느 함수를 실행해야될지 몰라 오류가 나오는 경우가 있습니다. 이러한 상황을 미연에 방지할 수 있는것이 바로 Interface입니다.

 

 

#include <iostream>

using namespace std;

class InterfaceA {
public:
	virtual void Print() = 0;
};

class InterfaceB {
public:
	virtual void Print() = 0;
};

class Child : public InterfaceA, InterfaceB {
public:
	void Print() override { cout << "Child" << endl; };
};

int main()
{
	Child child;

	child.Print();

	return 0;
}

이렇듯 Interface방식으로 정의할 경우 다중상속으로 인해 생기는 문제접을 원천적으로 막아줄 수 있습니다.

반응형