자바에서 추상 클래스(Abstract Class)와 인터페이스(Interface)는
모두 “설계도”처럼 동작합니다.
하지만 목적과 사용 방법은 다릅니다.
이번 글에서는 두 개념의 차이를 비교 중심으로 쉽게 정리해보겠습니다!
추상 클래스와 인터페이스란?
자바에서 코드를 설계할 때,
공통된 기능이나 규칙을 미리 정해두고 싶을 때 사용하는 것이 바로
✅ 추상 클래스와 인터페이스입니다.
둘 다 객체를 만들 수는 없지만,
“어떤 기능이 필요하다”는 규칙을 미리 정해주는 역할을 합니다.
- 추상 클래스는 "일부 기능을 직접 제공하면서 나머지는 자식에게 맡기고 싶을 때"
- 인터페이스는 "**기능 이름만 약속하고, 구현은 전적으로 자식에게 맡기고 싶을 때"
👇 자세한 내용은 아래 글을 확인해주세요!
[Java] 28. 추상 클래스란?
추상 클래스란?하나 이상의 추상 메서드(몸체 없는 메서드)를 포함하고 있는 클래스직접 객체를 만들 수 없고, 상속을 통해서만 사용할 수 있는 클래스입니다.일부는 직접 구현하고, 일부는 자
development-world.tistory.com
[Java] 29. 인터페이스
인터페이스란? 클래스가 어떤 기능을 반드시 구현해야 하는지 정해놓은 설계도입니다.메서드의 형태(이름, 매개변수, 리턴 타입)만 정의하고, 구현은 하지 않음클래스가 인터페이스를 implements(
development-world.tistory.com
공통점
공통점 | 설명 |
객체 생성 ❌ | 직접 객체를 만들 수 없음 (new 불가) |
상속/구현 필요 | 자식 클래스가 상속(extends)하거나 구현(implements) 해야 사용 가능 |
오버라이딩 필요 | 선언된 메서드는 자식 클래스에서 꼭 구현해야 함 (추상 메서드일 경우) |
설계용 클래스 | 기능의 “틀”을 제공하는 용도로 사용 |
차이점
항목 | 추상 클래스 | 인터페이스 |
선언 키워드 | abstract class | interface |
상속/구현 키워드 | extends (한 개만 가능) | implements (여러 개 가능) |
다중 상속 | ❌ 안 됨 | ✅ 가능 (다중 구현) |
생성자 | ✅ 있음 (자식 클래스가 호출 가능) | ❌ 없음 |
메서드 구성 | 추상 메서드 + 일반 메서드 모두 가능 | 기본은 추상 메서드만 (Java 8+부터 default 메서드도 가능) |
필드(변수) | 일반 변수 사용 가능 | 모두 public static final 상수만 가능 |
목적 | 공통 기능 제공 + 설계 | 역할 정의 (기능 이름만 약속) |
사용 예시 | 상속 관계 기반 클래스 구조 | 전략, DI, 프레임워크 구조 설계 등 |
예제 비교
추상 클래스 예제
* Animal 클래스 (부모 클래스)
abstract class Animal {
abstract void sound(); // 자식이 반드시 구현
void breathe() {
System.out.println("숨을 쉽니다.");
}
}
* Dog 클래스 (자식 클래스)
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
* 실행 클래스
public class Main {
public static void main(String[] args) {
Animal dog = new Dog(); // 업캐스팅
dog.sound();
dog.breathe();
}
}
- 출력 결과 -
멍멍
숨을 쉽니다.
- 공통 기능 breathe()는 부모 클래스에서 구현
- sound()는 자식 클래스가 반드시 구현
인터페이스 예제
* Animal 인터페이스
interface Animal {
void sound(); // 추상 메서드 (몸체 없음)
}
* Dog 클래스 (Animal 인터페이스를 구현하는 클래스)
class Dog implements Animal {
public void sound() {
System.out.println("멍멍");
}
}
* 실행 클래스
public class Main {
public static void main(String[] args) {
Animal dog = new Dog(); // 인터페이스 타입으로 구현체 참조
dog.sound();
}
}
- 출력 결과 -
멍멍
- sound()는 구현 강제됨
- 공통 구현은 제공하지 않음 (Java 8부터 default 키워드로 일부 가능)
추상 클래스, 인터페이스 언제 사용하는지?
상황 | 추상 클래스 | 인터페이스 |
“공통 기능을 일부 미리 구현해두고 싶다” | ✅ | ❌ |
“여러 역할을 조합해서 설계하고 싶다” | ❌ | ✅ (다중 구현) |
“한 부모만 상속받을 수 있다” | ✅ (단일 상속 제약 존재) | ❌ |
“기능 이름만 정의하고 구현은 자유롭게 하게 하고 싶다” | ❌ | ✅ |
"테스트와 유지보수를 고려하고 싶다" | 🛑 (제한적) | ✅ |
“프레임워크 설계나 전략 패턴 등을 쓰고 있다” | ❌ | ✅ (사용 필수) |
실무 팁
- 실무에서는 대부분 인터페이스 중심으로 설계합니다.
- Spring, JPA, 테스트 코드 등 대부분의 실무 프레임워크는 인터페이스 기반으로 설계되어 있습니다.
➡ 이는 유연한 의존성 주입, Mock 객체 테스트, 유지보수에 매우 유리하기 때문입니다. - 공통 로직이 정말 필요할 때만 추상 클래스를 사용하시면 됩니다.
요약 정리
항목 | 추상 클래스 | 인터페이스 |
목적 | 기본 기능 + 설계 제공 | 설계(기능 틀)만 제공 |
상속 | 단일 | 다중 구현 가능 |
코드 재사용 | 일부 가능 (일반 메서드) | 기본 불가 (default 사용 시 일부 가능) |
실무 사용도 | 드물게 사용 | 거의 필수로 사용됨 |
✅ 추상 클래스는 "일부분만 완성된 클래스",
인터페이스는 "기능 목록만 정리한 약속"입니다.
👉 현대 자바 개발에서는 인터페이스 중심 설계가 기본입니다.
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 32. Error(오류) vs Exception(예외) (0) | 2025.04.21 |
---|---|
[Java] 31. 내부 클래스란? (0) | 2025.04.18 |
[Java] 29. 인터페이스 (0) | 2025.04.18 |
[Java] 28. 추상 클래스란? (1) | 2025.04.17 |
[Java] 27. 추상 메서드란? (0) | 2025.04.17 |