인터페이스와 추상 클래스의 차이는 무엇인가요?
인터페이스와 추상 클래스는 객체지향 프로그래밍에서 공통적으로 “공통 기능의 규격”을 정의하기 위해 사용되지만, 그 목적과 특징, 사용방법에는 차이가 있습니다.
아래에서 두 개념의 차이점을 중심으로 설명하겠습니다.
--- 1. 정의 및 목적 - 인터페이스 (Interface) 인터페이스는 클래스가 반드시 구현해야 하는 메서드들의 선언(시그니처)만 포함하는 일종의 계약(Contract)입니다.
구체적인 구현 내용은 없으며, 다중 상속 및 다양한 클래스 간의 일관된 메서드 호출을 위해 사용됩니다.
- 추상 클래스 (Abstract Class) 추상 클래스는 일부 메서드가 구현되어 있을 수도 있고, 일부는 추상 메서드(구현이 없는 메서드)일 수도 있는 클래스입니다.
공통 기능을 공유하면서, 서브클래스가 반드시 구현해야 하는 메서드를 강제하는 역할을 합니다.
--- 2. 주요 차이점 | 구분 | 인터페이스 | 추상 클래스 | |----------------------------|---------------------------------------|----------------------------------------| | 메서드 구현 여부 | 기본적으로 메서드 시그니처만 선언 (예외: Java 8 이후 default 메서드 가능) | 일부 메서드는 구현 가능, 일부는 추상 메서드로 선언 | | 상속/구현 방식 | 클래스는 여러 인터페이스를 구현(implements) 가능 | 클래스는 단일 추상 클래스만 상속(extends) 가능 | | 생성자 존재 여부 | 없음 | 존재하며, 생성자에서 공통 초기화 가능 | | 상태(필드) 저장 가능 여부 | 상수를 제외한 필드는 가질 수 없음 | 인스턴스 변수(필드) 가질 수 있음 | | 목적 | 기능의 규격을 정의하여 다중 구현 허용 | 공통 기능 구현 및 강제 메서드 선언 | | 접근 제한자 사용 | 모든 메서드가 기본적으로 public (Java 기준) | 추상 클래스 내 메서드는 다양한 접근 제한자 가능 | --- 3. 예시 (Java 기준) ```java // 인터페이스 public interface Flyable { void fly(); // 추상 메서드 } // 추상 클래스 public abstract class Bird { public void eat() { System.out.println("먹는다"); } public abstract void fly(); // 반드시 하위클래스에서 구현 } ``` --- 4. 언제 사용하는가? - 인터페이스 사용 시기 - 서로 관련 없는 클래스가 공통적인 동작을 해야 할 때 - 다중 구현이 필요할 때 - 기능을 특정 행위별로 분리하여 유연한 설계가 필요할 때 - 추상 클래스 사용 시기 - 클래스들 간에 공통된 필드나 메서드 구현이 필요할 때 - 기본 동작을 정의하고, 일부 동작은 하위 클래스에 위임할 때 - 단일 상속 구조 내에서 확장성을 유지하고자 할 때 --- 5. 요약 | 평가 항목 | 인터페이스 | 추상 클래스 | |-----------------|----------------------------------|--------------------------------| | 메서드 구현 | 원칙적으로 불가 (Java 8부터 default 메서드 가능) | 부분적 구현 가능 | | 다중 상속/구현 | 다중 구현 가능 | 단일 상속만 가능 | | 필드(상태) 보유 | 상수만 가능 | 인스턴스 변수 가능 | | 생성자 | 없음 | 있음 | | 사용 목적 | 기능 규격(행위) 정의 | 공통 기능 구현 및 강제 구현사항 지정 | --- 인터페이스와 추상 클래스는 사용 목적과 특징이 다르므로, 상황과 설계 의도에 맞게 적절히 선택하는 것이 좋습니다.