2025년 2월 2일 일요일

추상클래스 vs 인터페이스 (인터페이스 default 메서드만 사용하는 이유)


추상 클래스 (abstract class)"상속"을 통한 코드 재사용이 필요할 때 사용
인터페이스 (interface)"구현 강제"가 필요하거나 다중 상속이 필요할 때 사용

➡ 일반적으로 "행위(기능)"를 정의하고 싶으면 인터페이스, "공통된 상태 + 동작"을 포함하려면 추상 클래스를 사용


왜 인터페이스는 default 메서드만 가능할까?

인터페이스는 원래부터 "설계도" 역할을 하며, 구현을 강제하는 용도로 만들어졌습니다.
즉, "어떤 기능을 제공할지 정의"하는 역할을 하며, 객체의 상태를 관리하지 않습니다.
따라서, 원래는 추상 메서드(abstract 메서드)만 허용되었고, 구현된 메서드는 가질 수 없었습니다.

그러나 Java 8부터 default 메서드가 추가된 이유는 "기존 인터페이스의 호환성 유지" 때문


인터페이스에서 일반 메서드를 허용하지 않는 이유

  1. 다이아몬드 문제 (Diamond Problem) 방지

    • 다중 상속 시, 같은 메서드를 여러 인터페이스에서 정의하면 충돌이 발생할 수 있음.
    • default 메서드는 명시적으로 오버라이드할 수 있도록 하여 문제 해결.
  2. 객체의 상태를 가지지 않음 (Stateless 원칙 유지)

    • 인터페이스는 본래 "무엇을 해야 하는지"만 정의하는 역할.
    • 상태(멤버 변수)를 가지면 클래스와 구분이 어려워지고 역할이 모호해짐.
  3. 기존 인터페이스와의 호환성 유지 (Backward Compatibility)

    • Java 8 이전에는 인터페이스에 새로운 메서드를 추가하면 모든 기존 구현체에서 컴파일 오류 발생
    • 이를 방지하기 위해 default 메서드를 도입하여 기본 구현을 제공할 수 있도록 함.




댓글 없음:

댓글 쓰기