안녕하세요 푸드테크팀 백엔드 개발자 권영호 입니다.
믹스인의 정의를 표현한 글을 보면 이해하기가 쉽지 않다
글의 정의는 어렵지만 간단하게 결국 멀티 인터페이스 또는 추상 클레스를 계층형으로 구현하여 메소드를 조합하는 것을 말한다.
계층 추상 클레스
public abstract class Singer {
void SingerPrint(){
System.out.println("SingerPrint");
};
}
public abstract class SongWriter extends Singer{
void songWriterPrint(){
System.out.println("songWriterPrint");
};
}
public class SingSongWriter extends SongWriter {
}
public class Main {
public static void main(String[] args) {
SingSongWriter singSongWriter = new SingSongWriter();
singSongWriter.SingerPrint();
singSongWriter.songWriterPrint();
}
}
멀티 인터페이스
public interface Singer {
default void SingerPrint(){
System.out.println("SingerPrint");
};
}
public interface SongWriter {
default void songWriterPrint(){
System.out.println("songWriterPrint");
};
}
public class SingSongWriter implements Singer, SongWriter {
}
public class Main {
public static void main(String[] args) {
SingSongWriter singSongWriter = new SingSongWriter();
singSongWriter.SingerPrint();
singSongWriter.songWriterPrint();
}
}
결국 추상 클레스와 멀티 인터페이스 모두 믹스인을 구현할수 있지만 결국 멀티인터페이스로 개발할수 밖에 없다.
추상 클레스를 계층형으로 상속하여 믹스인을 구현시 A -> B -> C 순으로 상속하여 만들었을 경우 A,C 만의 기능을 필요로 한 새로운 믹스인을 만들려면 B라는 클레스의 기능을 빼기 위해 상속 계층을 A -> C -> B 로 변경후 C클레스를 상속하는 형식으로 만들수 있지만 이렇게 하지 않고 멀티 인터페이스를 사용하여 구현하자
멀티 인터페이스로 구현시 아무 문제 없이 A,C 인터페이스를 상속하는 새로운 클레스를 만들어 사용하면 쉽게 구현할수 있다.
보시다 시피 추상 클레스로 믹스인을 구현시 계층 구조로 구현할수 밖에 없는데 이건 큰 불편을 가져오고 사용할 메소드가 늘어나거나 줄어들면 수정하기 쉽지 않는 구조이다.
다중 인터페이스로 구현시 조합이 간단하고 사용할 메소드가 늘어나거나 줄어들어도 수정이 용이하다.
이로써 믹스인에 대한 정리를 마치겠다.