You will be fine

<Lambda> 9. JAVA8 in Action - Chapter 9

by BFine
반응형

JAVA8 in Action - part3

Chapter 9 - 디폴트 메서드

9.1.0 변화하는 API

  • 설계자 입장에서 인터페이스에 새로운 메서드를 추가 ,수정하고 싶을때 문제가 발생한다.
  • 인터페이스를 바꾸면 상속받은 모든 클래스의 구현도 고쳐야한다.
  • 인터페이스 내부에 정적메서드, 디폴트메서드 기능이 추가 되었다.
  • 자바 8에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다.
  • 디폴트메서드를 이용하면 자바 API의 호환성을 유지하면서 라이브러리를 바꿀 수 있다.
  • 정적메서드는 Collections와 Collection 처럼 인터페이스 따로 정적 클래스 따로 쓸 필요가 없다.

9.1.1 API 버전

  • 공개된 API를 고치면 기존 버전과의 호환성 문제가 발생한다.

  • 바이너리 호환성 : 뭔가를 바꾼 후에도 에러없이 기존 바이너리가 실행되어야함

    인터페이스에 메서드 추가후 호출했는데 실행되지 않는 문제도 있음

  • 소스호환성 : 코드를 코쳐도 기존 프로그램을 성공적으로 재컴파일 할 수 있어야함

    추가한 메서드를 구현하도록 클래스를 수정해야함

  • 동작호환성 : 코드를 바꿔도 같은 입력값이 주어지면 같은 동작이 실행되어야함

9.2.0 디폴트메서드란 무엇인가?

  • 호환성을 유지하면서 API를 바꿀 수 있도록 새로운 기능이 디폴트메서드 이다.
  • 인터페이스 자체에서 기본적으로 제공하기 때문에 디폴트라고 부른다.
  • 추상클래스와 자바8 인터페이스의 차이
    • 클래스는 하나의 추상클래스만 상속받을 수 있지만 인터페이스는 여러개 구현할 수 있다.
    • 추상클래스는 인스턴스 변수로 공통 상태를 가질 수 있지만 인터페이스는 가질 수 없다.

9.3.1 선택형 메서드

  • 인터페이스를 구현한 클래스를 보면 메서드 내용이 빈 것이 있다.
  • 이러한 부분을 해결하기 위해 디폴트메서드를 사용하면 구현할 필요가 없다.

9.3.2 동작 다중 상속

  • 중복되지 않는 최소한의 인터페이스를 유지해 재사용과 조합이 가능하다
  • final로 선언된 클래스는 다른 클래스가 이클래스를 상속받지 못하게 함으로써 동작을 바꾸지 않는다.

9.4.1 알아야할 세가지 해석 규칙

  • 같은 시그니처를 갖는 디폴트메서드를 상속받는 상황이 생길 수 있다.
  • 1. 클래스나 슈퍼클래스에서 정의한 메서드가 최우선 순위
  • 2. 1번 이외로는 인터페이스 끼리 상속은 상속받은 쪽이 우선이다.
  • 3. 그외로는 상속받는 클래스에서 명시적으로 오버라이드하여 호출해야한다

9.4.3 충돌 그리고 명시적인 문제해결

  • 자바 8에서는 X.super.m(…) 형태의 새로운 문법을 제공한다.(X는 슈퍼인터페이스)
  • 위의 형태로 디폴트메서드를 구분할 수 있다.
    void hello(){
      B.super.hello();
    }

출처

  • Java8 in Action


반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기