1. 인터페이스란?
인터페이스는 객체가 무엇을 할 수 있는지에 대한 규약이다. 구현은 포함하지 않고, 행위만 정의한다. 즉, 어떻게가 아닌 무엇에에 집중한다.
interface Flyable {
void fly();
}
인터페이스는 구현이 아니라 약속이다.
2. 인터페이스의 기본 특징
다중 구현 가능
클래스는 하나의 클래스만 상속할 수 있지만, 인터페이스는 여러 개를 동시에 구현할 수 있다.
class Bird implements Flyable, Runnable {
public void fly() {}
public void run() {}
}
기능 단위로 조합 가능
상속의 한계를 보완
메서드의 성격
인터페이스의 메서드는 기본적으로 public, abstract 키워드가 자동으로 적용된다.
interface Pay {
void pay(); // public abstract가 생략된 것임
}
필드의 성격
인터페이스의 필드는 모두 public, static, final 즉, 상수만 가질 수 있다.
interface Status {
int OK = 200; // public static final
}
default 메서드
구현을 가진 메서드를 정의할 수 있다
- 기존 클래스에 영향을 주지 않기 위해
- 다형성 적용 가능
interface Logger {
default void log() {
System.out.println("log");
}
}
3. 추상 클래스 vs 인터페이스
둘 다 추상화를 위한 도구지만, 의도가 다르다.
공통점
- 객체 생성 불가
- 하위 클래스에서 구현 필요
- 다형성 적용 가능
차이점
| 구분 | 추상 클래스 | 인터페이스 |
| 메서드 | 추상 + 일반 | 기본적으로 추상 |
| 필드 | 인스턴스 필드 가능 | 상수만 가능 |
| 목적 | 공통 구현 제공 | 행위 규약 정리 |
| 상속/구현 | 단일 상속 | 다중 구현 |
4. 선택 전략
추상 클래스
- 공통 필드가 필요할 때
- 공통 구현 코드가 많을 때
- 상속 구조가 명확할 때
abstract class Animal {
int age;
abstract void sound();
}
인터페이스
- 행위 중심 추상화가 필요할 때
- 다중 구현이 필요할 때
- 결합도를 낮추고 싶을 때
interface Pay {
void pay();
}
5. 정리
- 인터페이스는 할 수 있다의 계약이다
- 다중 구현이 가능하다
- 필드는 상수만 가질 수 있다
- default 메서드는 예외적 도구임
- 추상 클래스와 인터페이스는 역할이 다름
- 선택 기준은 상태 vs 행위