[JAVA] "디폴트 메서드" & "static 메서드"

DongGyu Jung·2022년 1월 28일
0

자바(JAVA)

목록 보기
17/60
post-thumbnail

『인터페이스』참고
JDK 1.8 부터 해당*

원래 인터페이스에는
" 추상(abstract) 메서드 "만 선언할 수 있었지만
" 디폴트(default) 메서드 "와 " static 메서드 "도
추가할 수 있다.


● static 메서드

애초에 static 메서드의 경우는
" 인스턴스와 관계가 없는 독립적인 메서드 "이기 때문에
불가능할 것은 없었지만
JDK1.8부턴 추가할 수 있게 된 것이다.

● 디폴트 default 메서드

디폴트 메서드가 관건인데

사실
인터페이스에서 " 메서드 추가 "는 굉장히 머리 아파지는데

그 이유는
전에 알아봤듯이
인터페이스의 추상메서드를
모두 구현해야한다는 점 때문이다.

그렇게되면
" 하나의 메서드만 추가하더라도 "
인터페이스를 구현한 모든 클래스에서
이 추가한 메서드를 완성해야하는 상황이 벌어진다.

이 문제를 해결하기 위해 만들어진 것이
디폴트 (default) 메서드 》인 것이다.

당연히 가장 좋은 것은
인터페이스가 변경되지 않는 것 이고

언젠가 변경이 발생할 가능성이 높기 때문에
디폴트 메서드를 사용해야 하는데

비록 추상 메서드는 아니지만
" 추상 메서드의 기본적인 구현을 제공하는 메서드 "이기 떄문에
새로 추가되어도
해당 인터페이스를 구현한 모든 클래스를 변경하지 않아도 된다.

🔨 사용

  • 키워드 default
    ( 접근제어자는 public이지만 생략 가능하다)

  • (추상메서드와는 달리) 몸통이 필요하다 {}

/*
이와 같이 추상메서드를 추가하면
인터페이스 구현한 모든 클래스 수정 필요
*/
interface MyInterface {
    void method() ;
    void newMethod(); //추상메서드
}

/*
public 생략 가능
{} 작성 필요
*/
interface MyInterface {
    void method() ;
    default void newMethod() {} //default 메서드
}

그런데
이렇게 기존의 인터페이스의 원칙을 깨고
이런 예외사항이 생긴다면
당연히 충돌이 발생할 수 밖에 없다.

🧨 충돌 해결 규칙

여러 인터페이스 ▶ "디폴트 메서드" 간 충돌

: 인터페이스 구현 클래스에서 디폴트 메서드 "오버라이딩 "

② "디폴트 메서드" - "조상 클래스 멤버 메서드 " 간 충돌

: " 조상 클래스 메서드 " 상속 ( 디폴트 메서드 무시 )

0개의 댓글