2024.05.29. WED, <D + 9>
default method & static method
interface의 충돌 상황
// 1. interface와 상속관계 생성하기
class Parent {
public void method2() { //MyInterface와 충돌
System.out.println("method2(): Parent");
}
}
class Child extends Parent implements MyInterface1, MyInterface2{
@Override
public void method1() {
System.out.println("method1() : child");
}
}
interface MyInterface1 {
//default method 생성하기
default void method1() {
System.out.println("method1(): MyInterface1");
}
default void method2() {
System.out.println("method2(): MyInterface2");
}
//static method 생성하기
static void StaticMethod1() {
System.out.println("StaticMethod1(): MyInterface2");
}
}
interface MyInterface2 { //MyInterface1과 충돌
default void method1() {
System.out.println("method2(): MyInterface2");
}
//static method 생성하기
static void StaticMethod1() {
System.out.println("StaticMethod1(): MyInterface2");
}
}
public class DefaultStaticMethodEx1 {
public static void main(String[] args) {
Child child = new Child();
// 여러 interface에서 메소드명이 충돌하는 경우 확인해보기.
/**
* 충돌 상황에서 두 군데의 interface 중에 아무거나 하나를 구현하려는 클래스에 오버라이딩하면 됨.
* method1()은 결과 두 군데의 interface에 존재하고,
* 그리고, child class에 구현된 상태.
* 따라서, 코드 기준으로 총 3군데임. **/
child.method1(); // 결과 => method1(): Child
/**중복 상황은 클래스와 인터페이스간의 메소드 충돌임.
* 결과적으로 클래스의 메소드가 호출됨. **/
child.method2(); // 결과 => method2(): Parent
MyInterface1.StaticMethod1(); // 결과 => StaticMethod1(): MyInterface1
MyInterface2.StaticMethod1(); // 결과 => StaticMethod2(): MyInterface2
}
}