백엔드 수업 #08 인터페이스 - 07 디폴트 메소드와 인터페이스 확장

sookyoung.k·2022년 12월 7일
0
post-thumbnail

디폴트 메소드는 인터페이스 선언된 인스턴스 메소드이다. 구현 객체가 있어야 사용 가능! 선언은 인터페이스에서 하지만, 사용은 구현 객체를 통해서 하는 것... 좀 어색한 느낌이 있다.

인터페이스가 디폴트 메소드를 허용한 진짜 이유는 뭘까요?

디폴트 메소드의 필요성

기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서!

기존 인터페이스의 이름과 추상 메소드의 변경 없이 디폴트 메소드만 추가할 수 있어서 이전에 개발한 구현 클래스를 그대로 사용 가능하고, 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있다.

디폴트 메소드는 추상 메소드가 아니기 때문에 구현 클래스에서 실체 메소드를 작성할 필요가 없다!!!
때문에 인터페이스를 디폴트 메소드를 선언하면 구현 클래스에 영향을 주지 않으면서도 기능 추가가 가능한 것!

디폴트 메소드에 정의된 것을 그대로 사용해도 되고, 재정의 해서 사용할 수 있기 때문에 수정이 용이함!!

디폴트 메소드가 있는 인터페이스 상속

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

  1. 디폴트 메소드를 단순히 상속만 받기
  2. 디폴트 메소드를 재정의(오버라이드)해서 실행 내용 변경하기
  3. 디폴트 메소드를 추상 메소드로 재선언하기
public interface ParentInterface {
	public void method1();
    public default void method2(); {...}
}

추상메소드와 디폴트 메소드가 선언된 인터페이스

public interface ChildInterface1 extends ParentInterface {
	public void method3();
} 

자식 인터페이스는 자신의 추상 메소드를 선언

ChildInterface1 ci1 = new ChildInterface1() {
	@Override
    public void method1() {...}
    @Override
    public void method2() {...}
    
    ci1. method1(); 
    ci1. method2(); // 부모 인터페이스의 메소드2 호출 
    ci1. method3();
}

이 경우에는 메소드 1과 3의 실체 메소드를 가지고 있어야 한다!

public interface ChildInterface2 extends ParentInterface {
	@Override
    public default void method2() {...}; // 재정의
    
    public void method3();
} 

자식 인터페이스가 부모 인터페이스를 상속하고 자신의 추상 메소드를 선언

ChildInterface2 ci2 = new ChildInterface2() {
	@Override
    public void method1() {...}
    @Override
    public void method3() {...}
    
    ci2. method1(); 
    ci2. method2(); // 자식 메소드의 메소드 2 호출 
    ci2. method3();

이 경우도 메소드 1과 메소드 3의 실체 메소드를 갖고 있어야 하며, 재정의한 메소드 2를 호출할 수 있다.

public interface ChildInterface3 extends ParentInterface {
	@Override
    public void method2(); // 추상 메소드로 재선언 
    public void method3();
} 

자식 인터페이스가 부모 인터페이스를 상속하고 디폴트 메소드를 추상 메소드로 재선언했다. 그리고 자신의 추상 메소드를 선언!

ChildInterface3 ci3 = new ChildInterface3() {
	@Override
    public void method1() {...} 
    @Override
    public void method2() {...} 
    @Override
    public void method3() {...}
    
    ci2. method1(); 
    ci2. method2(); // 자식 메소드 구현 객체의 메소드 2 호출 
    ci2. method3();

이 경우에는 자식 인터페이스를 구현하는 클래스는 메소드 1, 2, 3의 실체 메소드를 모두 가지고 있어야 한다!

profile
영차영차 😎

0개의 댓글