관리 메뉴

생각해보기

모던 자바 인 액션 -11- 본문

자바

모던 자바 인 액션 -11-

정한_s 2021. 12. 20. 11:03

디폴트 메서드

자바 8에서는 인터페이스 내부에 정적 메서드(static method)와 디폴트 메서드(default method) 기능을 사용할 수 있다

 

자바8 이전에는 인터페이스를 보완하기 위해 인터페이스에 메서드를 추가하면서 문제가 발생했다. 인터페이스에 새로 추가된 메서드를 구현하도록 기존의 클래스를 고쳐야 했기 때문이다. 즉, 호환성 문제가 발생한다. 따라서 인터페이스의 기본 구현을 그대로 상속하면서 인터페이스에 자유롭게 새로운 메서드를 추가할 수 있는 디폴트 메서드가 탄생했다. 

 

호환성 문제

  • 바이너리 호환성 : 무언가를 바꾼 이후에도 에러 없이 기존 바이너리가 실행될 수 있는 상황
  • 소스 호환성 : 코드를 고쳐도 기존 프로그램을 성공적으로 재컴파일 할 수 있음
  • 동작 호환성 : 코드를 바꾼 다음에도 같은 입력값이 주어지면 프로그램이 같은 동작 실행 

디폴트 메서드는 인터페이스 자체에서 구현을 제공한다.

디플트 메서드는 default라는 키워드로 시작하며 메서드 바디를 가지고 있다

 

추상 클래스와 자바 8 인터페이스의 차이

  • 클래스는 하나의 추상 클래스만 상속받을 수 있지만 인터페이스는 여러 개 구현할 수 있다
  • 추상 클래스는 인스턴스 변수(필드)로 공통 상태를 가질 수 있지만 인터페이스는 상태를 가질 수 없다.

동작 다중 상속

디폴트 메서드를 이용하면 기존에는 불가능했던 동작 다중 상속 기능도 구현 할 수 있다. (자바에서는 클래스는 한 개의 다른 클래스만 상속할 수 있지만 인터페이스는 여러 개 구현 할 수 있기 때문이다)

 

알아야 할 세 가지 해결 규칙

자바 8에서 디폴트 메서드가 추가되면서 같은 시그니처를 갖는 디폴트 메서드를 상속받는 상황이 생길 수 있다. 따라서 이러한 문제에 대한 해결 규칙을 제공한다

  1. 클래스가 항상 이긴다. 클래서나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
  2. 1번 규칙 이외의 상황에서는 서브 인터페이스가 이긴다. 상속관계를 갖는 인터페이스에서 같은 시그니처를 갖는 메서드를 정의할 때는 서브인터페이스가 이긴다. 즉, B가 A를 상속 받는다면 B가 A를 이긴다
  3. 여전히 디폴트 메서드의 우선순위가 결정되지 않았다면 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야 한다.

 

'자바' 카테고리의 다른 글

모던 자바 인 액션 -13-  (0) 2021.12.21
모던 자바 인 액션 -12-  (0) 2021.12.20
모던 자바 인 액션 -10-  (0) 2021.12.19
모던 자바 인 액션 -9-  (0) 2021.12.19
모던 자바 인 액션 -8-  (0) 2021.12.17
Comments