본문 바로가기

JAVA/추상화(Abstraction)

추상 클래스와 인터페이스, 선택 기준과 활용 전략에 대해

추상 클래스와 인터페이스의 개념 비교

  1. 추상 클래스(Abstract class)
    • 메서드 바디가 없는 추상 메서드(abstract class)를 0개 이상 포함할 수 있는 클래스
    • 공통 속성(필드)와 기본 기능(구현된 메서드)를 함께 정의할 수 있다
    • 단일 상속만 가능하며, extends 키워드를 사용한다(상속)
  2. 인터페이스(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