본문 바로가기
language/java

Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

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 접근 범위와 캡슐화 관점까지 포함해서 정리해보겠습니다.

반응형

댓글