Java/8. 인터페이스 (Interface)

Day 11 : 디폴트 메소드의 필요성

pancakemaker 2021. 11. 2. 19:27

기존 인터페이스를 확장해서 새로운 기능을 추가할 때

 

디폴트 메소드는 추상 메소드가 아니기 때문에 구현 클래스에서 실체 메소드를 작성할 필요가 없음

 

기존 인터페이스

package sec07.exam01_why_default_mathod;

public interface MyInterface {
	public void method1(); //추상 메소드
	
	/*public default void method2() { //디폴트 메소드 추가하여 수정된 인터페이스
		System.out.println("MyInterface-method2() 실행");
	}
	*/
}

 

기존 구현 클래스

package sec07.exam01_why_default_mathod;

public class MyClassA implements MyInterface {

	@Override
	public void method1() { //MyInterface의 추상메소드 재정의
		System.out.println("MyClassA-method1() 실행");
	}

}

 

수정 인터페이스

package sec07.exam01_why_default_mathod;

public interface MyInterface {
	public void method1(); //추상 메소드
	
	public default void method2() { //디폴트 메소드 추가하여 수정된 인터페이스
		System.out.println("MyInterface-method2() 실행");
	}
}

 

새로운 구현 클래스

package sec07.exam01_why_default_mathod;

public class MyClassB implements MyInterface {

	@Override
	public void method1() { //MyInterface의 추상메소드 재정의
		System.out.println("MyClassB-method1() 실행");
	}
	
	@Override
	public void method2() { //MyInterface의 default 메소드 Override
		System.out.println("MyClassB-method2() 실행");
	}

}

 

디폴트 메소드 사용

package sec07.exam01_why_default_mathod;

public class DefaultMethodExample {
	public static void main(String[] args) {
		MyInterface mi1 = new MyClassA();
		mi1.method1(); //MyInterface의 추상메소드 -> MyClassA에서 재정의됨
		mi1.method2(); //MyInterface의 default 메소드
		
		MyInterface mi2 = new MyClassB();
		mi2.method1(); //MyInterface의 추상메소드 -> MyClassB에서 재정의됨
		mi2.method2(); //MyInterface의 default 메소드 -> MyClassB에서 재정의됨
	}
}
MyClassA-method1() 실행
MyInterface-method2() 실행
MyClassB-method1() 실행
MyClassB-method2() 실행