추상 클래스는 개념적으로 인스턴스화 할 수 없는 클래스. 즉, 인스턴스를 생성할 수 없는 클래스로, 일반적으로 하나 이상의 순수 가상 함수가 있는 클래스로 구현된다.
순수 가상 함수는 파생 클래스에 의해 재정의되어야 하는 함수이다. 이는 멤버 함수의 선언에서 "= 0"구문을 통해 정의된다.
class AbstractClass
{
virtual void abstractMemberFunction() = 0; // 순수 가상 함수
virtual void abstractMemberFunction1(); // 가상함수
void abstractMemberFunction2();
};
인터페이스는 구현이 없다.
즉, 인터페이스 클래스에는 가상 소멸자와 순수 가상함수만 포함된다.
인터페이스 클래스는 다형성 인터페이스, 즉 순수 가상 함수 선언을 기본 클래스로 지정하는 클래스이다.
class IClass
{
public:
virtual ~IClass();
virtual void move_x(int x) = 0;
virtual void move_y(int y) = 0;
virtual void draw() = 0;
};
모든 인터페이스 클래스에는 가상 소멸자가 있어야 한다. 가상 소멸자는 IClass가 다형성으로 삭제 될 때 파생 클래스의 올바른 소멸자가 호출되도록 한다.
interfaces can have no state or implementation
- 인터페이스는 상태나 구현을 가질 수 없다.
a class that implements an interface must provide an implementation of all the method of that interface
- 인터페이스를 구현하는 클래스는 해당 인터페이스의 모든 메소드를 구현해야 한다.
abstract classes may contain state (data members) and/or implementation (methods)
- 추상 클래스는 상태(data members) 및/또는 구현(method)을 포함할 수 있다.
abstract classes can be inherited without implementing the abstract methods (though such a derived class is abstract itself)
- 추상 클래스는 추상 메소드를 구현하지 않고 상속될 수 있다(유도 클래스 역시 추상 클래스).
interfaces may be multiple-inherited, abstract classes may not (this is probably the key concrete reason for interfaces to exist separately from abtract classes - they permit an implementation of multiple inheritance that removes many of the problems of general MI).
- 인터페이스는 다중 상속일 수 있지만 추상 클래스는 그렇지 않을 수 있다. (이것은 인터페이스가 추상 클래스와 별도로 존재하는 핵심 구체적인 이유일 것이다. 그것들은 일반 MI의 많은 문제를 제거하는 다중 상속의 구현을 허용한다.)
(MI가 뭐지..?)
If you anticipate creating multiple versions of your component, create an abstract class. Abstract classes provide a simple and easy way to version your components. By updating the base class, all inheriting classes are automatically updated with the change. Interfaces, on the other hand, cannot be changed once created. If a new version of an interface is required, you must create a whole new interface.
- 구성 요소의 여러 버전을 생성할 것으로 예상하는 경우 추상 클래스를 만들어라. 추상 클래스는 구성 요소를 쉽고 간단하게 버전화할 수 있는 방법을 제공한다. 기초 클래스를 업데이트하면 모든 상속 클래스가 변경 내용에 따라 자동으로 업데이트된다.
반면 인터페이스는 한 번 생성되면 변경될 수 없다. 인터페이스의 새 버전이 필요한 경우 완전히 새 인터페이스를 생성해야 한다.
If the functionality you are creating will be useful across a wide range of disparate objects, use an interface. Abstract classes should be used primarily for objects that are closely related, whereas interfaces are best suited for providing common functionality to unrelated classes.
- 생성 중인 기능이 서로 다른 광범위한 개체에서 유용한 경우 인터페이스를 사용해라. 추상 클래스는 주로 밀접하게 관련된 오브젝트에 사용되어야 하는 반면, 인터페이스는 관련 없는 클래스에 공통된 기능을 제공하는 데 가장 적합하다.
(아직 감이 잘 잡히지 않지만.. 일단은 정리함)