추상 클래스와 인터페이스의 개념 비교
- 추상 클래스(Abstract class)
- 메서드 바디가 없는 추상 메서드(abstract class)를 0개 이상 포함할 수 있는 클래스
- 공통 속성(필드)와 기본 기능(구현된 메서드)를 함께 정의할 수 있다
- 단일 상속만 가능하며, extends 키워드를 사용한다(상속)
- 인터페이스(Interface)
- 상수(public static final 필드)와 추상 메서드(public abstract 메서드)로만 구성된 일종의 계약서임
- 다중 구현이 가능하며, implements 키워드를 사용한다
- Java 8부터는 default / static 메서드를 통해 일부 구현도 가능하다
언제 추상클래스를 사용해야 하는가?
1. 공통 속성과 기본 기능이 필요한 경우
모든 동물은 이름이 존재하고, 먹을 수 있는 기능이 있다
abstract class Animal {
String name;
void eat() {
System.out.println("먹는다");
}
}
2. 일관된 기본 동작 제공 + 자식 클래스 확장 허용
공통된 로직을 제공하면서도 일부 메서드는 자식 클래스에서 반드시 구현하도록 강제할 수 있다
3. 단일 상속 구조가 적절한 경우
상속 계층이 명확하게 정해져 있을 때 사용한다
언제 인터페이스를 사용해야 하는가?
1. 동작(기능)만 정의하고 구현은 위임하고 싶을 때
움직일 수 있는 능력에 대해서만 정의하고, 각 클래스는 이를 자유롭게 구현할 수 있다
interface Movable {
void move();
}
2. 여러 타입에 동일한 기능을 강제하고 싶을 때
하나의 클래스가 여러 역할을 수행하도록 허용한다
3. 다중 구현이 필요한 경우
클래스는 하나만 상속할 수 있지만, 인터페이스는 여러개를 구현할 수 있다
추상 클래스 vs 인터페이스
| 구분 | 추상 클래스 | 인터페이스 |
| 사용 키워드 | extends | implements |
| 상속 수 | 단일 상속만 가능함 | 다중 구현 가능함 |
| 구성 요소 | 필드, 구현 메서드, 추상 메서드 | 상수, 추상 메서드 (default, static 가능) |
| 용도 | 공통된 상태와 기능을 제공 | 동작 규칙 정의 및 구현 강제 |
| 예시 관계 | is - a | can - do |
잘못된 추상화 예
abstract class Employee {
String name;
int employeeId;
abstract void writeCode();
}
class Admin extends Employee {
void writeCode() {
throw new UnsupportedOperationException("관리자는 코드를 작성하지 않는다");
}
}
* writeCode()는 일부 직원(개발자)만 사용하게끔 만든 기능인데, 모든 하위 클래스에 강제되고 있다(추상 클래스)
* 리스코프 치환 원칙(SOLID의 L) 위반 : 하위 타입이 상위 타입을 완전히 대체하지 못하는 상황
개선 방법 : 역할 분리
abstract class Employee {
String name;
int employeeId;
}
interface Coder {
void writeCode();
}
class Developer extends Employee implements Coder {
public void writeCode() {
System.out.println("코드를 작성합니다");
}
}
class Admin extends Employee {
}
* 공통된 속성은 Employee 추상 클래스에서 관리함
* 행동 Coder 인터페이스로 분리해서 필요한 클래스만 구현한다
정리
* 상속 계층 설계가 필요하다면 - > 추상클래스
* 역할(기능)만 정의하고, 구현은 위임하고 싶다면 - > 인터페이스
| 상황 | 추상 클래스 | 인터페이스 |
| is - a 관계(상속 기반) | O | X |
| can - do 관계(기능 부여) | X | O |
| 공통된 상태(필드)를 함께 정의하고 싶을 때 | O | X |
| 공통된 기능(메서드)만 정의하고 싶을 때 | O | OO |
| 단일 상속 구조 | OO | O |
| 다중 타입 구현 필요(다중 상속) | X | O |
| 개념 | 의미 | 설명 | 예시 |
| is - a | 상속 | A는 B의 일종이다 | Cat is - a Animal |
| has - a | 포함 (컴포지션) | A는 B를 가진다 | Car has - a Engine |
| can - do | 행위 능력 (인터페이스) | A는 어떠한 행동을 할 수 있다 | Bird can - do Flyable |
'JAVA > 추상화(Abstraction)' 카테고리의 다른 글
| 인터페이스(interface) (0) | 2026.04.21 |
|---|---|
| final 키워드 (0) | 2026.04.21 |
| 추상 클래스 (0) | 2026.04.20 |
| abstract 제어자 (0) | 2026.04.20 |
| 추상화(Abstraction) (0) | 2026.04.20 |