일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- DP
- 피보나치
- 너비우선탐색
- DFS
- 이펙티브자바
- Greedy
- Effective Java
- Spring
- BFS
- 그리디알고리즘
- 알고리즘
- java
- 데이터베이스
- 정렬
- mariaDB
- 다이나믹프로그래밍
- 탐욕법
- mybatis
- SQL
- select
- 코테
- Database
- join
- 우선순위큐
- springboot
- 깊이우선탐색
- db
- 프로그래머스
- IntelliJ
- 백준
- Today
- Total
땀두 블로그
[도서] Effective Java - Item20. 추상 클래스보다는 인터페이스를 우선하라 본문
이펙티브 자바 3판을 읽으면서 내용을 정리하는 포스트입니다. 혹시 틀린 부분이나 잘 못 설명한 부분이 있으면 댓글로 남겨주시면 수정하도록 하겠습니다.
Item20. 추상 클래스보다는 인터페이스를 우선하라
추상클래스와 인터페이스는 디폴트 메소드를 통해서 인스턴스 메소드를 구현 형태로 제공할 수 있다는 공통점이 있지만 차이점이 많이 존재한다.
차이점
추상 클래스는 정의한 타입을 구현하는 클래스는 반드시 추상클래스의 하위 클래스가 되어야 한다. 자바에서는 단일 상속을 하기 때문에 새로운 타입을 정의하는데 제약이 있다.
인터페이스는 선언한 메소드를 모두 정의하고, 규약을 잘 지킨 클래스라면 어떤 클래스를 상속하더라도 같은 타입으로 취급한다.
또한 인터페이스는 implements
구문을 통해 쉽게 구현해넣을 수 있는 반면 추상클래스는 두 클래스가 공통 조상이어야지만 상속해서 사용이 가능하다.
인터페이스는 믹스인 정의에 알맞고, 추상 클래스는 두 부모를 섬길 수 없기 때문에 이 또한 불가능하다.
※ 믹스인 : 대상 타입의 주된 기능에 선택적 기능을 혼합하는 기능
또한 인터페이스는 계층구조 없는 타입 프레임워크를 만들 수 있고, 래퍼 클래스와 함께 사용하여 기능 향상을 안전하게 할 수 있다.
default 메소드
구현 내용이 있는 메소드로, 구현 방법이 명확하다면 인터페이스에서 사용이 가능하다.
default 메소드를 사용할 때는 다음과 같은 주의사항이 있다.
- @impleSpec을 붙여 문서화하면 좋다.
- Object 메소드를 디폴트 메소드로 제공하면 안된다.
- 인터페이스는 인스턴스 필드를 가질 수 없고, public이 아닌 정적 멤버도 가질 수 없다.
- ※ Java 9 이후부터는 private static 메소드도 구현이 가능하게 변경되었다.
추상골격 구현 클래스
인터페이스로 타입을 정의하고, 필요하다면 디폴트 메소드 몇 개를 제공하면 골격 구현 클래스에서 나머지 메소드들을 구현하는 것이다. 추상 클래스처럼 구현을 도와주는 동시에, 추상클래스로 타입을 정의할 때 따라오는 심각한 제약에서 자유롭다.
관례상 인터페이스가 Interface
라는 이름을 가지면 골격 구현 클래스는 AbstractInterface
로 명명한다.
골격 구현 클래스는 추상클래스로 타입을 정의할 때 있는 제약에 대해서 자유롭지만 골격 구현을 확장하지 못하여 인터페이스를 직접 구현해야 한다.
골격 구현 작성
- 인터페이스를 확인하여 다른 메소드들의 구현에 사용되는 기반 메소드를 선정한다.
- 기반 메소드를 사용해 직접 구현 가능한 메소드를 모두 디폴트 메소드로 제공한다.
-
Object의 메소드는 디폴트 메소드로 제공하면 안된다.
-
- 기반 메소드나 디폴트 메소드로 만들지 못한 메소드가 있다면 인터페이스를 구현하는 골격 구현 클래스를 만들어 남은 메소드를 넣는다.
골격구현은 기본적으로 상속해서 사용하기 때문에 설계 및 문서화를 잘 해두어야 한다.
'도서' 카테고리의 다른 글
[도서] Effective Java - Item 22. 인터페이스틑 타입을 정의하는 용도로만 사용하라 (0) | 2022.05.11 |
---|---|
[도서] Effective Java - Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2022.05.11 |
[도서] Effective Java - Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2022.05.11 |
[도서] Effective Java - Item 18. 상속보다는 컴포지션을 사용하라 (0) | 2022.05.11 |
[도서] Effective Java - Item 17. 변경 가능성을 최소화하라. (0) | 2022.05.11 |