기본 개념 정리
| 항목 | interface | abstract class |
|---|
| 목적 | 기능(역할)의 명세를 정의 | 공통 속성과 기능의 기본 구현 제공 |
| 키워드 | interface | abstract class |
| 다중 구현 가능 여부 | ✅ 다중 구현 가능 (implements) | ❌ 단일 상속만 가능 (extends) |
| 메서드 구현 여부 | Java 8 이상부터 default 메서드 가능 | 구현된 메서드 포함 가능 |
| 필드 선언 | public static final(상수)만 가능 | 인스턴스 변수 선언 가능 |
| 생성자 | ❌ 생성자 없음 | ✅ 생성자 있음 |
인터페이스 예제
- 기능을 약속하는 역할
Drawable을 구현하면 무조건 draw()를 구현해야 함
interface Drawable {
void draw();
}
class Circle implements Drawable {
public void draw() {
System.out.println("원을 그립니다.");
}
}
추상 클래스 예제
- 공통 속성(name) + 기본 동작(eat) + 추상 메서드(sound)
- 일부 구현이 되어 있음 → 상속받아서 확장하는 형태
abstract class Animal {
String name;
void eat() {
System.out.println("먹는다.");
}
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
}
interface, abstract class 적절한 사용시기
interface를 사용하는 경우
- 기능을 정의할 때 (예: 그릴 수 있다, 저장할 수 있다 등)
- 여러 클래스에 공통된 역할을 부여할 때
- 다중 구현이 필요한 경우
- “~할 수 있다” 형태의 기능 중심:
Cloneable, Readable
- 예:
Comparable, Runnable, Serializable
✅ abstract class를 사용하는 경우
- 공통 상태(필드)와 동작(메서드)을 공유해야 할 때
- 기본 메서드를 제공하면서, 일부 메서드는 하위 클래스가 구현하도록 강제하고 싶을 때
- 단일 상속이 괜찮은 구조일 때
- “~이다” 형태의 구조 중심:
Animal, Shape, Vehicle
- 예:
HttpServlet, AbstractList
정리
| 사용 목적 | interface | abstract class |
|---|
| 기능 중심 | 다양한 클래스에 기능을 공통적으로 부여 | X |
| 공통 속성/기본 구현 | X | 부모 클래스에서 공통 구현 제공 |
| 다중 구현 필요 여부 | 필요하다면 interface 사용 | 단일 상속이면 abstract class도 OK |
| 변경 가능성 | 기능 중심 변경 시 유연성 좋음 | 공통 로직이 자주 바뀌지 않는 경우에 적합 |