인터페이스는 타입을 정의할 때 추상 클래스는 보통 인터페이스의 구현체를 일부 기본적으로 제공할 때
자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다. (완벽 공략 3)
디폴트로는 구현이 안 되는 경우 어떤 인스턴스 Field를 사용해야 하는 경우에는 기본 구현체 제공은 추 상 클래스가 할 수 있다.
public interface TimeClient {
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
int hour, int minute, int second);
LocalDateTime getLocalDateTime();
static ZoneId getZonedId(String zoneString) {
try {
return ZoneId.of(zoneString);
} catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString + "; using default time zone instead.");
return ZoneId.systemDefault();
}
}
default ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZonedId(zoneString));
}
}
기존 클래스도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다.
인터페이스는 믹스인(mixtin) 정의에 안성맞춤이다. (선택적인 기능 추가)
계층구조가 없는 타입 프레임워크를 만들 수 있다.
public interface SingerSongwriter extends Singer, Songwriter{
AudioClip strum();
void actSensitive();
}
래퍼 클래스와 함께 사용하면 인터페이스는 기능을 향상 시키는 안전하고 강력한 수단이 된다. (아이템 18)
구현이 명백한 것은 인터페이스의 디폴트 메서드를 사용해 프로그래머의 일감을 덜어 줄 수 있다.
인터페이스 - 디폴트 메서드 구현
추상 골격 클래스 - 나머지 메서드 구현
// 코드 20-1 골격 구현을 사용해 완성한 구체 클래스 (133쪽)
public class IntArrays {
static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(a);
// 다이아몬드 연산자를 이렇게 사용하는 건 자바 9부터 가능하다.
// 더 낮은 버전을 사용한다면 <Integer>로 수정하자.
**return new AbstractList<>() {**
@Override public Integer get(int i) {
return a[i]; // 오토박싱(아이템 6)
}
@Override public Integer set(int i, Integer val) {
int oldVal = a[i];
a[i] = val; // 오토언박싱
return oldVal; // 오토박싱
}
@Override public int size() {
return a.length;
}
};
}
public static void main(String[] args) {
int[] a = new int[10];
for (int i = 0; i < a.length; i++)
a[i] = i;
List<Integer> list = intArrayAsList(a);
Collections.shuffle(list);
System.out.println(list);
}
}
public class MyCat extends AbstractCat implements Flyable {
private MyFlyable myFlyable = new MyFlyable();
@Override
protected String sound() {
return "인싸 고양이 두 마리가 나가신다!";
}
@Override
protected String name() {
return "유미";
}
public static void main(String[] args) {
MyCat myCat = new MyCat();
System.out.println(myCat.sound());
System.out.println(myCat.name());
myCat.fly();
}
@Override
public void fly() {
this.myFlyable.fly();
}
**private class MyFlyable extends AbstractFlyable {
@Override
public void fly() {
System.out.println("날아라.");
}
}**
}
템플릿 메서드 패턴