Skip to content

Commit

Permalink
item-20 추상 클래스보다는 인터페이스를 우선하라.
Browse files Browse the repository at this point in the history
  • Loading branch information
Lokie89 committed Jul 15, 2020
1 parent 7ecef64 commit 86e82f7
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 0 deletions.
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,32 @@ public abstract class AbstractCollection<E> implements Collection<E> {
이 도우미 메서드를 호출하도록 수정한다.
그런 다음 재정의 가능 메서드를 호출하는 다른 코드들도 모두 이 도우미 메서드를 직접 호출하도록 수정하면 된다.

# item-20 추상 클래스보다는 인터페이스를 우선하라.
#### 정리
인터페이스와 추상 클래스의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는
반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다.
자바는 단일 상속만 지원하기 때문에, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 안게 된다.
반면 인터페이스가 선언한 메서드를 모두 정의하고 그 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.

인터페이스는 주된 타입 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다.
인터페이스로는 계층구조가 업슨 타입 프레임워크를 만들 수 있다.

인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다.

인터페이스 메서드 중 구현 방법이 명백한 것이 있다면, 디폴트 메서드로 제공할 수 있다.
디폴트 메서드에는 제약이 있다. equals 와 hashCode 같은 Object 메서드를 제공해서는 안된다.
또 인터페이스는 인스턴스 필드를 가질 수 없고, public 이 아닌 정적 멤버도 가질 수 없다.

인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있다.
인터페이스로는 타입을 정의하고, 골격 구현 클래스는 나머지 메서드들까지 구현한다.
골격 구현은 그 인터페이스로 나름의 구현을 만들려는 프로그래머의 일을 상당히 덜어준다.
골격 구현 클래스의 아름다움을 추상클래스처럼 구현을 도와주는 동시에,
추상 클래스로 타입을 정의할 때 따라오는 심각한 제약에서는 자유롭다는 점에 있다.

골격 구현 작성은 인터페이스를 잘 살펴 다른 메서드들의 구현에 사용되는 기반 메서드들을 선정한다.
기반 메서드들을 사용해 직접 구현할 수 있는 메서드를 모두 디폴트 메서드로 제공한다.
만약 인터페이스의 메서드 모두가 기반 메서드와 디폴트 메서드가 된다면 골격 구현 클래스를 별도로 만들 필요가 없다.

# item-1
#### 정리
#### 내용 추가
10 changes: 10 additions & 0 deletions src/item20/Singer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package item20;

import java.applet.AudioClip;

public interface Singer {
AudioClip sing(Song s);
default void singSomeThing(){
System.out.println("SING!!");
}
}
8 changes: 8 additions & 0 deletions src/item20/SingerSongWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package item20;

import java.applet.AudioClip;

public interface SingerSongWriter extends Singer, SongWriter {
AudioClip strum();
void actSensitive();
}
30 changes: 30 additions & 0 deletions src/item20/SingerSongWriterImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package item20;

import java.applet.AudioClip;

public class SingerSongWriterImpl implements SingerSongWriter{
@Override
public AudioClip strum() {
return null;
}

@Override
public void actSensitive() {

}

@Override
public AudioClip sing(Song s) {
return null;
}

@Override
public Song compose(int chartPosition) {
return null;
}

public static void main(String[] args) {
Singer singer = new SingerSongWriterImpl();
singer.singSomeThing();
}
}
4 changes: 4 additions & 0 deletions src/item20/Song.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package item20;

public class Song {
}
5 changes: 5 additions & 0 deletions src/item20/SongWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package item20;

public interface SongWriter {
Song compose(int chartPosition);
}

0 comments on commit 86e82f7

Please sign in to comment.