Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기
Java 객체지향 설계를 배우다 보면 반드시 등장하는 주제가 바로:
추상 클래스(Abstract Class) vs 인터페이스(Interface)
입니다.
초보 시절에는 보통:
“추상 클래스는 하나만 상속”
“인터페이스는 다중 구현 가능”
정도로만 외우고 넘어가기 쉽습니다.
하지만 실제 실무에서는:
- Spring
- JPA
- 전략 패턴
- DI
- 프레임워크 설계
전부 인터페이스 기반으로 동작할 정도로 매우 중요한 개념입니다.
이번 글에서는:
- 추상 클래스와 인터페이스의 차이
- JVM 관점에서 어떻게 동작하는가
- 왜 Spring은 인터페이스 기반인가
- 실무에서는 언제 무엇을 선택하는가
까지 정리해보겠습니다.
1. 추상 클래스(Abstract Class)란?
추상 클래스는:
공통 기능은 제공하지만 객체 생성은 불가능한 클래스
입니다.
예시:
abstract class Animal {
void eat() {
System.out.println("먹는다");
}
abstract void sound();
}
특징:
- 일부 구현 가능
- 일부 추상 메서드 가능
- 직접 객체 생성 불가
2. 추상 메서드(Abstract Method)
abstract void sound();
의미:
구현은 자식 클래스가 반드시 해야 함
입니다.
3. 추상 클래스 객체 생성 불가
Animal animal = new Animal();
컴파일 에러 발생.
왜냐하면:
완전한 객체가 아니기 때문
입니다.
4. 추상 클래스 사용 예시
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
5. 추상 클래스의 목적
추상 클래스는:
공통 기능 재사용
+
자식 클래스 규약 강제
를 위해 존재합니다.
6. 인터페이스(Interface)란?
인터페이스는:
객체의 행동 규약(명세)만 정의하는 구조
입니다.
예시:
interface Payment {
void pay();
}
즉:
“결제 기능은 반드시 있어야 한다”
라는 계약(contract) 정의.
7. 인터페이스 구현
class CardPayment implements Payment {
@Override
public void pay() {
System.out.println("카드 결제");
}
}
8. implements 의미
implements
의미:
인터페이스 규약 구현
입니다.
9. 추상 클래스 vs 인터페이스 핵심 차이
| 목적 | 공통 기능 재사용 | 규약 정의 |
| 상속 키워드 | extends | implements |
| 다중 상속 | 불가능 | 가능 |
| 상태(필드) | 가능 | 제한적 |
| 생성자 | 가능 | 불가능 |
10. Java는 왜 인터페이스를 만들었을까?
Java는 클래스 다중 상속을 금지합니다.
왜냐하면:
Diamond Problem
문제 때문입니다.
그래서:
다중 구현
을 위해 인터페이스 도입.
11. 인터페이스 다중 구현
interface Flyable {
void fly();
}
interface Swimable {
void swim();
}
class Duck implements Flyable, Swimable {
public void fly() {}
public void swim() {}
}
가능.
12. 인터페이스의 진짜 핵심
인터페이스의 핵심은:
구현체 교체 가능 구조
입니다.
예시:
Payment payment
뒤 구현체:
- CardPayment
- KakaoPayment
- NaverPayment
쉽게 교체 가능.
13. 다형성과 인터페이스
Payment payment = new CardPayment();
핵심:
- 인터페이스 의존
- 구현체 분리
즉:
결합도 감소
효과.
14. Spring이 인터페이스 기반인 이유
Spring 핵심 철학:
구현체보다 추상화에 의존
예시:
@Autowired
Payment payment;
실제 객체는:
- CardPayment
- KakaoPayment
등 다양하게 주입 가능.
15. 인터페이스와 DI
Spring DI는 사실상:
인터페이스 기반 다형성
입니다.
16. 추상 클래스의 장점
| 공통 코드 재사용 | 중복 제거 |
| 기본 구현 제공 | 편의성 |
| 상태 관리 가능 | 필드 보유 가능 |
17. 인터페이스 장점
| 결합도 감소 | 구현 분리 |
| 다중 구현 가능 | 유연성 |
| 테스트 쉬움 | Mock 처리 용이 |
18. 실무에서는 무엇을 더 많이 쓸까?
현대 Java/Spring 실무에서는:
인터페이스
를 훨씬 많이 사용합니다.
이유:
- 유연성
- 테스트 편의성
- 확장성
- DI 구조
때문.
19. 추상 클래스가 더 좋은 경우
예시:
공통 상태/로직 많음
대표 사례:
AbstractController
AbstractEntity
20. 인터페이스 default method
Java 8 이후 추가.
interface Payment {
default void log() {
System.out.println("log");
}
}
인터페이스도 일부 구현 가능해짐.
21. 왜 default method가 추가됐을까?
기존 인터페이스 변경 시:
모든 구현체 수정 필요
문제 발생.
이를 해결하기 위해 도입.
22. 인터페이스 static method
interface Util {
static void hello() {
}
}
가능.
23. JVM 관점 차이
추상 클래스:
일반 클래스와 유사
메모리 구조.
인터페이스:
구현 규약 중심 메타데이터
성격이 강함.
24. 실무에서 자주 하는 실수
1) 무조건 인터페이스 생성
작은 프로젝트에서는 과한 추상화 가능.
2) 추상 클래스에 너무 많은 기능 몰아넣기
God Abstract Class
문제 발생 가능.
3) 인터페이스 없이 구현체 직접 의존
CardPayment payment = new CardPayment();
유연성 감소.
25. 상속보다 인터페이스를 선호하는 이유
상속은:
강한 결합
발생.
인터페이스는:
느슨한 결합(Loose Coupling)
가능.
26. 전략 패턴과 인터페이스
대표적인 실무 패턴.
전략 변경
↓
구현체 교체
if/switch 감소 가능.
27. 인터페이스 기반 설계의 핵심
좋은 구조는:
구현보다 추상화에 의존
합니다.
즉:
- 구현 변경 가능
- 확장 쉬움
- 테스트 쉬움
장점.
28. 언제 무엇을 선택해야 할까?
추상 클래스 추천 상황
공통 상태/기능 많음
인터페이스 추천 상황
역할/규약 정의
29. 실무 기준 추천
실무에서는 보통:
인터페이스 우선
필요 시 추상 클래스 보조
전략을 많이 사용합니다.
30. 정리
추상 클래스(Abstract Class)와 인터페이스(Interface)는 단순 문법 차이가 아닙니다.
실제로는:
- 객체 설계
- 다형성
- 결합도
- 확장성
- Spring DI
- 전략 패턴
전체와 연결되는 핵심 객체지향 개념입니다.
특히 실무에서는:
- 인터페이스 기반 설계
- 느슨한 결합
- 다형성 활용
- 추상화 의존
을 이해하는 것이 매우 중요합니다.
다음 글에서는:
접근 제어자(private/protected/public/default)
를 JVM 접근 범위와 캡슐화 관점까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java this / super 키워드 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| Java 접근 제어자(private/protected/public/default) 완벽 이해하기 (0) | 2026.05.22 |
| Java 다형성(Polymorphism) 완벽 이해하기 (0) | 2026.05.22 |
| Java 상속(Inheritance) 완벽 이해하기 (0) | 2026.05.22 |
| Java 캡슐화(Encapsulation) 완벽 이해하기 (0) | 2026.05.22 |
댓글