인터페이스는 믹스인 정의에 안성맞춤!
믹스인이란?
// 비교 기능(Comparable)과 반복 기능(Iterable)이 혼합 구현 되어있다.
class MyClass implements Comparable, Iterable {
...
}
계층구조가 없는 타입 프레임워크를 만들 수 있다
타입을 계층적으로 정의하면 수많은 개념을 구조적으로 잘 표현 가능하지만 계층이 엄격히 구분하기 어려운 개념도 존재
public interface Singer{
AudioClip sing(Song s);
}
public interface Songwriter {
Song compose(int charPosition);
}
public interface SingerSongwriter extends Singer, Songwriter {
AudioClip strum();
void actSensitive();
}
같은 구조를 클래스로 구현하게되면 가능한 조합 전부를 각각의 클래스로 정의한 고도비만 계층구조가 만들어짐 → 조합 폭발 현상
public abstract class Singer {
abstract void sing();
}
public abstract class SongWriter {
abstract void compose();
}
public abstract class SingerSongWriter {
abstract void actSensitive();
abstract void sing();
abstract void compose();
}
디폴트 메서드
public interface Student {
public void study();
public default void syaHello() {
System.out.println("안녕하세요");
}
}
equals
, hashCode
는 디폴트 메서드로 제공할 수 없다.public interface Character {
public void move();
public void seat();
public void attack();
}
public class Thief implements Character{
@Override
public void move() {
System.out.println("걷다");
}
@Override
public void seat() {
System.out.println("앉다");
}
@Override
public void attack() {
System.out.println("표창을 던진다");
}
}
public class Wizard implements Character{
@Override
public void move() {
System.out.println("걷다");
}
@Override
public void seat() {
System.out.println("앉다");
}
@Override
public void attack() {
System.out.println("마법봉을 휘두르다");
}
}
//추상 골격 구현 클래스 사용하는 버전
public abstract class AbstractCharacter implements Character{
@Override
public void move() {
System.out.println("걷다");
}
@Override
public void seat() {
System.out.println("앉다");
}
}
public class Thief extends AbstractCharacter implements Character{
@Override
public void attack() {
System.out.println("표창을 던진다");
}
}
public class Wizard extends AbstractCharacter implements Character{
@Override
public void attack() {
System.out.println("마법봉을 휘두르다");
}
}
<aside> ☝🏻 일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합
→ 복잡한 인터페이스라면 골격 구현을 함께 제공하는 방법을 꼭 고려하자!
→ 골격 구현은 가능하면 인터페이스의 디폴트 메서드로 제공하여 인터페이스를 구현한 모든 곳에서 활용 가능하도록 하자! (구현상에 제약이 있다면 추상 클래스로 제공)
</aside>