본문 바로가기
Java

[Java] 인터페이스와 추상 클래스 (Interface and Abstract Class)

by clolee 2025. 5. 7.

✅ 자바에서 인터페이스와 추상 클래스는 왜 필요한가?

─ 설계 유연성과 다형성을 위한 구조 설계 가이드


🔷 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 교체)
유연한 설계와 변경 대응 인터페이스 기반 + 구현체는 교체 가능하도록 설계

🧠 정리: 한 줄 요약

"인터페이스는 설계 계약, 추상 클래스는 공통 기능과 기본 구조"
그리고 자바는 인터페이스를 통해 다중 상속의 유연함을 얻는다.


댓글