개발 새발/JAVA

[Java] 자바 객체지향 - 추상클래스 VS 인터페이스

recordari 2025. 4. 10. 19:09

인터페이스 vs 추상 클래스

추상 클래스와 인터페이스는 둘 다 미완성 설계를 제공하고, 다형성과 유연한 구조 설계를 위한 핵심 개념이다.

하지만 둘 사이에는 분명한 차이가 있다.
→ 이 차이는 언제 추상 클래스를 쓰고, 언제 인터페이스를 써야 하는지 판단 기준이 된다.

 

주요 차이점 비교

구분 추상 클래스 인터페이스

구분 추상클래스 인터페이스
키워드 abstract class interface
상속/구현 방법 extends implements
다중 상속 불가능 가능
멤버 구성 추상 메서드, 일반 메서드, 변수 등 포함 추상 메서드, 상수만 포함 (Java 8 이후 일부 메서드 허용)
접근 제어자 자유롭게 설정 가능 모든 메서드는 public abstract, 모든 변수는 public static final (생략 가능)
공통 기능 구현 가능 (일반 메서드 포함) 불가능 (Java 8 이후 default 메서드로 일부 구현 가능)
사용 목적 클래스 간 상속 관계를 표현 기능적인 계약(규약, 역할) 정의
의미 "A는 B이다" (IS-A 관계) "A는 B의 기능을 가진다" (기능 명세)

 

 

사용 판단 기준

  • 공통적인 속성과 메서드까지 공유할 필요가 있다면 → 추상 클래스
    (예: 모든 동물은 숨을 쉰다 → breathe() 공통 구현)
  • 서로 관련 없는 클래스들에게 특정 기능을 강제하고 싶다면 → 인터페이스
    (예: 걷는 기능을 갖는 것 → Walkable 인터페이스로 표현)

 

예시로 보는 차이

추상 클래스 예시
(공통 동작 breathe()를 포함)

abstract class Animal {
    abstract void sound();
    void breathe() {
        System.out.println("숨을 쉰다");
    }
}

 

인터페이스 예시
(기능만 정의)

interface Flyable {
    void fly();
}

class Bird implements Flyable {
    public void fly() {
        System.out.println("하늘을 난다");
    }
}

 

 

결론

  • 추상 클래스는 설계 틀과 공통 구현을 제공하는 역할
  • 인터페이스는 특정 역할(기능)에 대한 약속을 정의

→ 추상 클래스는 상속 구조를 설계할 때 사용
→ 인터페이스는 구현의 일관성과 확장을 고려할 때 사용