모던 자바 인 액션 Chap 13

doxxx·2022년 7월 16일
0

모던자바인액션

목록 보기
9/14
post-thumbnail

Chapter 13. 디폴트 메서드

들어가며

  • 인터페이스에 새로운 메서드를 추가하는 등 인터페이스를 바꾸고 싶을 때 발생하는 문제를 해결할 수 있게 됐다.

  • 기본 구현을 포함하는 인터페이스를 정의하는 두가지 방법

    • 인터페이스 내부에 정적 메서드를 사용한다.
    • 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용한다.
  • 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속 받게 된다.

  • default 키워드: 해당 메서드가 디폴트 메서드임을 가리킨다.

13.1 변화하는 API

  • 바이너리 호환성: 새로 추가된 메서드를 호출하지만 않으면 새로운 메서드 구현이 없이도 기존 클래스 파일 구현이 잘 동작한다.
    • 뭔가를 바꾼 이후에도 에러 없이 기존 바이너리가 실행될 수 있는 상황
    • 인증, 준비, 해석 등의 과정이 포함된다.
    • 인터페이스에 메서드를 추가 했을 때 추가된 메서드를 호출하지 않는 이상 문제가 발생하지 않는다.
  • 소스 호환성: 코드를 고쳐도 기존 프로그램을 성공적으로 재컴파일할 수 있음을 의미한다.
  • 동작 호환성: 코드를 바꾼 다음에도 같은 입력값이 주어지면 프로그램이 같은 동작을 실행한다는 의미이다.

13.2 디폴트 메서드란?

  • 인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다.

  • 인터페이스를 구현하는 모든 클래스는 default 메서드의 구현도 상속 받는다.

    • 따라서, 소스 호환성이 유지된다.
  • 함수형 인터페이스는 오직 하나의 추상 메서드를 포함한다.

    • 디폴트 메서드는 추상 메서드에 해당하지 않는다.
    • 따라서 함수형 인터페이스도 디폴트 메서드를 가질 수 있다.

추상 클래스와 인터페이스

  • 공통점
    • 추상 메서드와 바디를 포함하는 메서드를 정의할 수 있다.
  • 차이점
    • 클래스는 하나의 추상 클래스만 상속받을 수 있지만, 인터페이스를 여러 개 구현할 수 있다.
      • 인터페이스의 다중상속
    • 추상 클래스는 인스턴스 변수(필드)로 공통 상태를 가질 수 있다. 인터페이스는 인스턴스 변수를 가질 수 없다.

13.3 디폴트 메서드 활용 패턴

  • 디폴트 메서드를 이용하는 두가지 방식
    • 선택형 메서드
    • 동작 다중 상속

동작 다중 상속

  • 구현 클래스는 다중 상속을 통해서 여러 기능을 상속 받을 수 있다.

  • 기능이 중복되지 않는 최소의 인터페이스

    • 템플릿 디자인 패턴과 비슷해 보인다.
  • 델리게이션: 멤버 변수를 이용해서 클래스에 필요한 메서드를 직접 호출하는 메서드를 작성하는 것이 좋다.

    • final로 선언된 클래스의 경우 이 클래스를 상속받지 못하게 함으로써 원래 동작이 바뀌지 않게 한다.

13.4 해석 규칙

같은 시그니처를 갖는 두 메서드를 상속받는 클래스 문제

  • 해결 규칙
    • 클래스가 항상 우선이다. 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
    • 서브 인터페이스가 그 다음이다. 상속 관계를 갖는 인터페이스에서 같은 시그니처를 갖는 메서드를 정의할 때, 서브 인터페이스가 우선권을 갖는다.
    • 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야한다.

0개의 댓글

관련 채용 정보