java8 번외
갑자기 생각나서 쓴다.
java8 의 추가된 기능 중
interface
에 관한 내용이다.
java8 interface는
static
메소드도 구현 가능하다.
이로써 util interface를 구현 할 수 있다는 거다.
또 다른 하나는
default
키워드가 추가 되어 메소드 바디를 갖는 인터페이스가 추가 되었다.
그러면서 다중 상속의 개념이 다시 등장했다.
그래서 한번 테스트를 해봤다.
interface Man {
default void print(String name) {
System.out.println("Man :" + name);
}
}
interface WoMan {
default void print(String name) {
System.out.println("WoMan :" + name);
}
}
이런 두개의 인터페이스가 있다고 가정하자.
그리고 두개의 인터페이스를 상속해보자
class Hermaphrodite implements Man,WoMan {
}
그럼 intellij에선 컴파일 에러가 난다.
같은 동일한 메소드가 다 구현 되어 있어서 에러를 내는거 같다.
만약 메소드가 동일 하지 않다면 에러를 내뱉지 않는다.
이로써 다아이몬드 상속은 해결된건가?
다음 코드도 한번 보자.
interface Human{
default void print(String name) {
System.out.println("Human " + name);
}
}
interface Man extends Human{
default void print(String name) {
System.out.println("Man :" + name);
}
}
interface WoMan extends Human{
default void print(String name) {
System.out.println("WoMan :" + name);
}
}
class Hermaphrodite implements Man,WoMan {
@Override
public void print(String name) {
System.out.println("Hermaphrodite : " + name);
}
}
네개의 클래스와 인터페이스를 만들고 해보자.
public static void main(String[] args) {
Human man = new Hermaphrodite();
man.print("wonwoo");
}
실행 결과는
Hermaphrodite : wonwoo
무조건 구현해야 되기 때문에 나올 수 밖에 없다.
그럼 Woman의
default
메소드를 제거하고
Hermaphrodite
구현체를 제거해보자.
interface WoMan extends Human{
}
class Hermaphrodite implements Man,WoMan {
}
다시 실행해보자.
public static void main(String[] args) {
Human man = new Hermaphrodite();
man.print("wonwoo");
}
기대했던 결과는
Man wonwoo
일 것이다.
그럼 다음 코드를 보자.
interface Human {
default void print(String name) {
System.out.println("Human " + name);
}
}
interface Man extends Human {
default void print(String name) {
System.out.println("Man " + name);
}
}
interface WoMan extends Human {
default void print(String name) {
System.out.println("Man " + name);
}
}
class Hermaphrodite implements Man, WoMan {
@Override
public void print(String name) {
Man.super.print("wonwoo");
WoMan.super.print("no!");
}
}
Human man = new Hermaphrodite();
man.print("wonwoo");
wonwoo
no!
이렇게 하면 다중상속이 된다.