JAVA Programming

Growing_HJ·2024년 5월 29일

일기장

목록 보기
11/51

2024.05.29. WED, <D + 9>
default method & static method
interface의 충돌 상황

  • 클래스간의 상속, 인터페이스를 활용한 다중 상속처럼 사용중인 경우
  • 클래스의 메소드명, interface의 default 메소드 명이 중복되는 경우가 발생
  • 여러 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
	}
}

0개의 댓글