일단 씻고 나가자
23.06.21 본문
2023. 06. 21 수요일
- [Effective Java] extends와 implments의 차이? default 메서드란? 사용 방법?
: extends(확장)는 하나의 클래스만 가능하지만,
implements(구현)는 두 개 이상의 인터페이스가 가능하다.
기존엔 인터페이스가 껍데기(abstract) 메서드만 가질 수 있었지만,
java 8부터 default method의 개념으로 구현된 메서드를 가져올 수 있게 되었다.
default method는 접근 제어자의 키워드인 ‘default’와 같지만,
접근 제어자는 명시하지 않아도 default가 되지만
default method는 접근 제어자 앞에 default를 명시하고 메서드 내용을 구현하여야 에러가 뜨지 않는다.
(ex. default (public) myMethod() { ... })
- [Effective Java] default method로 발생할 수 있는 문제? java가 제공하는 solution?
: default method를 다중 구현하게 되면 다중 상속에서 벌어질 수 있는 다이아몬드 문제를 유발할 수 있다. 다이아몬드 문제란 같은 이름의 default method가 다중 구현될 인터페이스에 각각 있을 때 어떤 메서드를 override 해야 할지 모르는 문제이다.
(단순히 default method가 없는, 메서드 명이 같은 인터페이스들을 다중 구현할 때는 발생하지 않는 문제이다.)
java 8은 이러한 문제에 3가지 규칙을 따른다.
1. 클래스가 항상 이긴다.
2. 1번 규칙 이외에선 sub interface가 이긴다. (가장 최근에 구현한 인터페이스)
3. 그 외엔 명시적 호출한다. (A, B를 C가 구현한다면 C() { A.super.method명(); }
- [Effective Java] 추상 골격 구현이란?
: Skeletal implementation(추상 골격 구현)
Interface로 뼈대 -> Abstract class로 필요 구현 -> Sub class로 마무리
이때 Object method(equals, toString) 등은 default method로 제공하면 안 된다.
이를 탬플릿 메서드 패턴(template method pattern)이라 한다.