Interface vs. Abstract Class
인터페이스는 클래스가 ‘무엇을 해야 하는지’를 정의하는 계약(contract)과 같은 역할을 한다.
모든 메서드가 추상 메서드로 이루어져 있으며, 구현부가 없는 메서드 선언만을 포함한다.
이는 마치 설계 명세서와 같아서, 클래스가 반드시 구현해야 하는 기능들을 정의한다.
추상 클래스(Abstract Class)는 하나 이상의 추상 메서드를 포함하는 클래스이다.
일반 메서드와 추상 메서드를 모두 가질 수 있으며, 관련된 클래스들의 공통적인 특성과 행위를 정의한다. 이는 마치 미완성된 설계도와 같아서, 기본적인 구조는 제공하지만 일부 세부사항은 하위 클래스에서 완성해야 한다.
특성 | Interface | Abstract Class |
---|---|---|
정의 | 완전히 추상화된 클래스, 메서드 시그니처만 정의 | 부분적으로 구현된 클래스, 추상 메서드와 구체 메서드 모두 포함 가능 |
메서드 | 추상 메서드만 가능 | 추상 메서드와 구체 메서드 모두 가능 |
변수 | public static final 상수만 가능 | 모든 종류의 변수 선언 가능 |
생성자 | 생성자를 가질 수 없음 | 생성자를 가질 수 있음 |
다중 상속 | 다중 구현 가능 | 단일 상속만 가능 |
접근 제어자 | 모든 메서드는 public (암묵적) | 모든 접근 제어자 사용 가능 |
인스턴스화 | 직접 인스턴스화 불가능 | 직접 인스턴스화 불가능 |
사용 목적 | 클래스의 행동을 정의하는 계약 | 관련 클래스들의 공통 특성을 정의하고 일부 구현 제공 |
확장성 | 쉽게 확장 가능 | 확장에 제한이 있을 수 있음 |
구현 복잡성 | 상대적으로 간단 | 더 복잡할 수 있음 |
주요 차이점과 특징
- 구현 수준의 차이: 인터페이스는 메서드의 선언만을 포함하지만, 추상 클래스는 일부 구현된 메서드를 포함할 수 있다. 이는 코드 재사용성 측면에서 중요한 차이를 만든다.
- 목적의 차이: 인터페이스는 클래스의 행위를 규정하는 계약의 역할을 하며, 추상 클래스는 관련된 클래스들의 공통 기능을 제공하고 확장성을 부여한다.
- 사용 시나리오: 인터페이스는 서로 다른 클래스들이 동일한 방식으로 동작해야 할 때 사용된다. 예를 들어, 다양한 결제 방식(신용카드, 현금, 모바일 결제 등)을 구현할 때 유용하다.
추상 클래스는 비슷한 특성을 가진 클래스들의 공통 기능을 정의할 때 사용된다.
예를 들어, 다양한 도형 클래스들의 공통 특성을 정의할 때 적합하다.
- 다중 상속/구현: 한 클래스는 여러 인터페이스를 동시에 구현할 수 있지만, 추상 클래스는 단일 상속만 가능하다. 이는 설계의 유연성에 큰 영향을 미친다.
- 멤버 변수와 메서드: 인터페이스는 일반적으로 상수와 추상 메서드만을 포함할 수 있다. 반면 추상 클래스는 인스턴스 변수, 생성자, 일반 메서드, 추상 메서드 등 모든 종류의 멤버를 가질 수 있다.
인터페이스와 추상 클래스를 함께 사용하는 예시
|
|
이 예시에서 Drawable은 인터페이스의 역할을, Shape는 추상 클래스의 역할을 한다.
Circle 클래스는 둘 다의 특성을 상속받아 구체적인 기능을 구현한다.
용어 정리
용어 | 설명 |
---|---|