✅ 자바에서 인터페이스와 추상 클래스는 왜 필요한가?
─ 설계 유연성과 다형성을 위한 구조 설계 가이드
🔷 1. 왜 인터페이스/추상 클래스가 필요한가?
📌 다중 상속 불가한 자바의 특징
class A {}
class B {}
class C extends A, B {} // ❌ 컴파일 에러
- 자바는 클래스 다중 상속 금지 → 다중 상속의 모호성 문제 (Diamond Problem) 방지
✅ 그래서 등장한 해결책
개념 |
설명 |
인터페이스 |
다중 상속의 대체 수단. 구현은 없고 규칙만 정의 |
추상 클래스 |
공통 동작의 기본 구현을 제공하고, 자식 클래스가 선택적으로 오버라이딩 |
🔷 2. 인터페이스(Interface)
✅ 정의
- 모든 메서드는 암묵적으로
public abstract
- 모든 필드는 암묵적으로
public static final
- 구현체가 무조건 메서드를 오버라이딩해야 함
✅ 사용 이유
목적 |
설명 |
다형성 제공 |
다양한 클래스들이 같은 규칙(인터페이스)을 따르게 함 |
다중 상속 가능 |
여러 인터페이스를 동시에 구현 가능 |
느슨한 결합 |
인터페이스만 의존하면 구현체 교체가 쉬움 (DI, 테스트에 좋음) |
✅ 예제
interface Animal {
void sound(); // public abstract 생략 가능
}
class Dog implements Animal {
public void sound() {
System.out.println("멍멍");
}
}
class Cat implements Animal {
public void sound() {
System.out.println("야옹");
}
}
public class Main {
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 멍멍
a2.sound(); // 야옹
}
}
✅ 실무 사용 예시
Spring
에서 Controller, Service, Repository 구조 정의
- 다양한 구현체를 사용하는 전략 패턴(Strategy Pattern)
Comparator
, Runnable
, Serializable
등도 전부 인터페이스
🔷 3. 추상 클래스(Abstract Class)
✅ 정의
- 인스턴스 생성 불가
- 일부 메서드는 구현, 일부는 abstract로 선언 가능
- 공통 로직 + 설계 구조를 동시에 제공 가능
✅ 사용 이유
목적 |
설명 |
코드 중복 제거 |
여러 자식 클래스 간에 공통 로직 제공 |
구조 통일 + 부분 구현 |
필수 메서드만 추상화하고, 나머지는 기본 구현 가능 |
메서드 오버라이딩 유도 |
템플릿 메서드 패턴에 적합 |
✅ 예제
abstract class Vehicle {
abstract void move(); // 구현 강제
void fuel() {
System.out.println("기름 주입");
}
}
class Car extends Vehicle {
void move() {
System.out.println("도로 주행");
}
}
class Boat extends Vehicle {
void move() {
System.out.println("바다 주행");
}
}
Vehicle v = new Car();
v.move(); // 도로 주행
v.fuel(); // 기름 주입
🔷 4. 인터페이스 vs 추상 클래스 비교표
항목 |
인터페이스 |
추상 클래스 |
다중 구현 |
✅ 가능 |
❌ 단일 상속만 |
생성자 |
❌ 없음 |
✅ 있음 |
필드 |
public static final 만 가능 |
인스턴스 변수 가능 |
메서드 |
모두 추상 (Java 8부터 default 가능) |
일부 구현, 일부 추상 가능 |
사용 목적 |
규칙 정의, 느슨한 결합 |
기본 기능 + 공통 구조 제공 |
실무 예 |
전략, 콜백, 다형성 |
템플릿 메서드, 서비스 공통기능 구현 등 |
🔷 5. 실무 설계 기준
상황 |
추천 구조 |
다양한 구현체에 동일한 기능만 정의 |
인터페이스 |
공통 기능을 제공 + 일부만 추상화 |
추상 클래스 |
공통 인터페이스 + 기본 로직도 제공 |
인터페이스 + 추상 클래스 병행 |
Spring DI, 테스트 편의 |
인터페이스 활용 (Mock 교체) |
유연한 설계와 변경 대응 |
인터페이스 기반 + 구현체는 교체 가능하도록 설계 |
🧠 정리: 한 줄 요약
"인터페이스는 설계 계약, 추상 클래스는 공통 기능과 기본 구조"
그리고 자바는 인터페이스를 통해 다중 상속의 유연함을 얻는다.
댓글