본문 바로가기
JAVA

인터페이스 (default method)

by 요리하다그만둠 2022. 5. 25.

인터페이스에서 디폴트 메서드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서이다. 기존 인터페이스의 이름과 추상 메서드의 변경 없이 디폰트 메서드만 추가할 수 있기 때문에 이전에 개발한 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메서드를 활용할 수 있다.

 

보통 기존에 있던 인터페이스에 이를 구현할 클래스가 있는데 인터페이스에 기능을 추가해야 하여 인터페이스에 추상 메서드를 추가했는데 클래스에서 문제가 발생한다.

그 이유는 추상 메서드에 대한 실체 메서드가 존재하지 않기 때문인데 여기서 클래스를 수정할 여건이 안된다면 인터페이스에 메서드를 추가할 수 없게 된다. 그래서 인터페이스에 디폴트 메서드를 선언해준다.

 

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

따라서 클래스는 아무런 문제 없이 계속 사용할수 있다.

 

public interface MyInterface {
	
	// 추상 메서드
	public void method1();
}
public class MyClassA implements MyInterface {

	@Override // 실체메서드 정의
	public void method1() {
		System.out.println("MyClassA-method() 실행");
		
	}
	
}

디폴트 메서드를 추가해보겠습니다.

public interface MyInterface {
	// 추상 메서드
	public void method1();
	
	// 디폴트 메서드 
	public default void method2() {
		System.out.println("MyInterface-method2 실행");
	}
}

인터페이스를 수정하였는데 컴파일 에러가 발생하지 않습니다.

이번에는 인터페이스를 구현하는 새로운 구현 클래스인 MyClassB를 조금 바꿔서 정의해보겠습니다.

public class MyClassB implements MyInterface {

	@Override
	public void method1() {
		System.out.println("MyClassB-method 실행");
	}
	
	@Override // 디폴트 메서드 재정의
	public void method2() {
		System.out.println("MyClassB-method2() 실행");
	}
}

이제 MyClassA와 MyClassB를 객체로 생성하고 인터페이스 변수에 메서드 1. 메서드 2를 호출해 보고 결과를 보겠습니다.

public class DefaultMethodEx {
	public static void main(String[] args) {
		MyInterface mi1 = new MyClassA();
		mi1.method1();
		mi1.method2();
		MyInterface mi2 = new MyClassB();
		mi2.method1();
		mi2.method2();
	}
}

부모 인터페이스에 디폴트 메서드가 정의 되어 있을 경우 자식 인터페이스에서 디폴트 메서드를 활용히는 방법은 다음 세 가지가 있다.

• 디폴트 메소드를 단순히 상속만 받는다

• 디폴트 메소드를 재정의 (Override) 해서 실행 내용을 변경한다

• 디폴트 메소드를 추상 메소드로 재선언한다

'JAVA' 카테고리의 다른 글

컬렉션 프레임워크 ArrayList  (0) 2022.05.30
예외 처리  (0) 2022.05.26
2022년 5월 25일 수업중 과제 : 계산기 프로그램  (0) 2022.05.25
인터페이스  (0) 2022.05.24
상수의 데이터 타입  (0) 2022.05.15