추상 클래스와 인터페이스의 차이
🖥️ C++에서 순수 가상 메서드를 이용한 인터페이스 구현 방법
C++에서는
다중 상속
때문에 C#이나 Java처럼 인터페이스와 추상 클래스의 구분이 필요 없고, 순수 가상 메서드가 있는 추상 클래스가 인터페이스 역할을 함.
이런 클래스는 직접 만들 수 없고, 자식 클래스에서 메서드를 구현해야 함. C++에서 순수 가상 메서드를 사용하면 인터페이스처럼 동작하고, 코드의 명확성과 유지 관리를 도와줌.
🖥️ 추상 클래스란?
보다 구체적인 클래스가 파생될 수 있는 일반 개념의 식 역할을 한다. 추상 클래스 형식의 개체는 만들 수 없지만, 포인터 및 참조를 사용하여 추상 클래스 형식을 사용할 수 있다.
- 클래스 내부에 순수 지정자(= 0) 구문을 사용하여 선언된 가상 함수를 하나 이상 포함하면, 이를 추상 클래스라고 한다.
추상 클래스에서 파생된 클래스는 순수 가상 함수를 구현해야하며, 구현하지 않을 시 해당 클래스도 추상 클래스이다.
★ Abstract 메서드가 아닌 메서드가 존재할 수 있으며, 이는 파생 클래스에서 구현할 필요가 없다.
🖥️ 추상 클래스의 장점
- 다른 자식(파생) 클래스에 대한 기본 클래스를 제공하지만, 인터페이스와는 달리 파생 클래스에서 모든 부모 클래스의 메서드를 구현할 필요는 없다.
🖥️ 인터페이스란?
클래스를 구현할 수 있는 방법을 정의하며, 인터페이스는 클래스가 아니다. (클래스는 인터페이스만 구현할 수 있다.)
클래스가 인터페이스에서 선언된 함수를 정의하는 경우 함수가 재정의되지 않고 구현된다.
인터페이스에는 함수, 이벤트 및 속성에 대한 선언을 포함할 수 있으며, 생성자나 필드가 없기 때문에 인스턴스를 만들 수 없다.
※ .NET 버전에서는 인터페이스 정의시, 접두사로 ‘I’를 붙여줌으로써 다른 요소들과 구분된다.
🖥️ 인터페이스의 장점
- 다형성에서의 기능 분업화 : 기능이 필요한 하위 클래스에 다중 상속 시킴으로써 두 객체에만 기능을 추가할 수 있다.
- 프로퍼티 구현 방법 : Getter, Setter를 인터페이스에서 강제할시, 파생 객체는 구현을 반드시 마무리 지어야한다. 즉 반드시 구현이 필요한 요소를 강제할 수 있다.
- 명세 중복에 대한 유연함 : 파생 객체에서 인터페이스 다중 상속을 통해 명세가 중복되더라도 구현이 중복되지 않기 때문에 기능 동작에 문제가 없다.
- 구현을 포함한 인터페이스 : C++에서만 가능하며, 매크로 사용 없이 Code Generation을 할 수 있다. ※ 구현된 함수와 같은 시그니처의 함수가 다른 상속한 클래스가 있을 때 문제가 발생할 수 있음.
🖥️ 인터페이스의 정의
- 0개 이상의 기본 인터페이스에서 상속할 수 있다.
- 기본 클래스에서 상속할 수 없다.
- 공용 순수 가상 메서드만 포함할 수 있다.
- 생성자, 소멸자 또는 연산자를 포함할 수 없다.
- 정적 메서드를 포함할 수 없다.
- 데이터 멤버를 포함할 수 없다. (속성은 허용)
🖥️ 추상 클래스와 인터페이스의 차이점
추상 클래스 | 인터페이스 |
---|---|
하나만 상속 가능 | 다중 상속 가능 |
메서드와 속성 외에도 전체 코드 구성 가능 | 메서드와 속성만 선언 가능 |
일반 클래스와 같이 접근 제한자(public, private 등)를 가짐. | 접근 제한 불가능 |
메소드 추가시, 모든 하위 클래스 자동으로 적용 가능. | 메소드 추가시, 모든 하위 클래스에 반드시 적용해야 함. |
필드 혹은 다른 요소(ex: 상수 등)를 가질 수 있으며, 구조체를 포함할 수 있음. | 필드 혹은 다른 요소를 가질 수 없으며, 구조체를 포함할 수 없음. |
클래스 중 한 타입에 속함. | 클래스가 아님. |
인터페이스, 추상클래스, 다른 클래스 모두 상속 가능함. | 인터페이스만 상속 가능함. |
출처 :
* https://blog.devgenius.io/what-is-the-difference-between-interface-and-abstract-class-1b76277f2659
* https://learn.microsoft.com/ko-kr/cpp/cpp/abstract-classes-cpp?view=msvc-170
* https://learn.microsoft.com/ko-kr/cpp/cpp/interface?view=msvc-170
* https://learn.microsoft.com/ko-kr/cpp/extensions/interface-class-cpp-component-extensions?view=msvc-170
* https://www.linkedin.com/pulse/what-difference-between-interface-abstract-class-david-ramazani/
* https://algorfati.tistory.com/205