추상 클래스와 인터페이스의 차이


🖥️ C++에서 순수 가상 메서드를 이용한 인터페이스 구현 방법

C++에서는 다중 상속때문에 C#이나 Java처럼 인터페이스와 추상 클래스의 구분이 필요 없고, 순수 가상 메서드가 있는 추상 클래스가 인터페이스 역할을 함.
이런 클래스는 직접 만들 수 없고, 자식 클래스에서 메서드를 구현해야 함. C++에서 순수 가상 메서드를 사용하면 인터페이스처럼 동작하고, 코드의 명확성과 유지 관리를 도와줌.


🖥️ 추상 클래스란?

보다 구체적인 클래스가 파생될 수 있는 일반 개념의 식 역할을 한다. 추상 클래스 형식의 개체는 만들 수 없지만, 포인터 및 참조를 사용하여 추상 클래스 형식을 사용할 수 있다.

  • 클래스 내부에 순수 지정자(= 0) 구문을 사용하여 선언된 가상 함수를 하나 이상 포함하면, 이를 추상 클래스라고 한다.
    추상 클래스에서 파생된 클래스는 순수 가상 함수를 구현해야하며, 구현하지 않을 시 해당 클래스도 추상 클래스이다.

★ Abstract 메서드가 아닌 메서드가 존재할 수 있으며, 이는 파생 클래스에서 구현할 필요가 없다.


🖥️ 추상 클래스의 장점

  • 다른 자식(파생) 클래스에 대한 기본 클래스를 제공하지만, 인터페이스와는 달리 파생 클래스에서 모든 부모 클래스의 메서드를 구현할 필요는 없다.

🖥️ 인터페이스란?

클래스를 구현할 수 있는 방법을 정의하며, 인터페이스는 클래스가 아니다. (클래스는 인터페이스만 구현할 수 있다.)
클래스가 인터페이스에서 선언된 함수를 정의하는 경우 함수가 재정의되지 않고 구현된다.
인터페이스에는 함수, 이벤트 및 속성에 대한 선언을 포함할 수 있으며, 생성자나 필드가 없기 때문에 인스턴스를 만들 수 없다.

※ .NET 버전에서는 인터페이스 정의시, 접두사로 ‘I’를 붙여줌으로써 다른 요소들과 구분된다.


🖥️ 인터페이스의 장점

  1. 다형성에서의 기능 분업화 : 기능이 필요한 하위 클래스에 다중 상속 시킴으로써 두 객체에만 기능을 추가할 수 있다.
  2. 프로퍼티 구현 방법 : Getter, Setter를 인터페이스에서 강제할시, 파생 객체는 구현을 반드시 마무리 지어야한다. 즉 반드시 구현이 필요한 요소를 강제할 수 있다.
  3. 명세 중복에 대한 유연함 : 파생 객체에서 인터페이스 다중 상속을 통해 명세가 중복되더라도 구현이 중복되지 않기 때문에 기능 동작에 문제가 없다.
  4. 구현을 포함한 인터페이스 : 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


© 2024. All rights reserved.

Powered by Hydejack v9.2.1