티스토리 뷰

Java 8 에서 람다표현식나 Collection Stream API가 추가 되면서 인터페이스에 필연적인 변화가 생겼다.  인터페이스에도 defaut, static 메서드를 통해 구현된 메서드를 추가할 수 있는 방법이 생긴 것이다.  예제를 통해 한번 알아보자

 

1.default method

java8 에 default method 가 추가 됐다. default method 가 추가된 이유는 기존 인터페이스들의 호환성을 위해서다. 특정 인터페이스에 메서드를 추가하면 해당 인터페이스를 구현하고 있는 모든 클래스의 변경이 필요하다. 그렇기 때문에 구현체가 있는 default 메서드를 정의하면 하위 클래스에서 오버라이드 할 필요가 없기 때문에 기존 인터페이스에 안전하게 추가할 수 있다. 아래는 인터페이스에 추가된 default method 에 한 예제이다.

interface bird {
 default void fly() {
   System.out.println("날개를 펄럭이다");
 }
}

몇 가지 차이점(인스턴스 변수의 활용, 개념적인 차이)은 있지만 기능적으로는 추상 클래스의 메서드와 비슷한 용도로 활용될 수 있는 것 같다.  그런데 인터페이스에 default 메서드가 추가되면서 논리적인 문제점이 발생한다. 자바는 다중 상속을 할 수 없다. 하지만 인터페이스는 여러개의 인터페이스 구현이 가능하다. 그렇다면 한개의 클래스에서 2개의 인터페이스를 구현하고 있는데 default 메서드명이 같다면 ...?? 

public interface Plane {
	default void fly() {
    	System.out.println("엔진 점화");
    }
}

아래와 같이 2개의 동일한 이름의 default 메서드를 가지고 있는 인터페이스를 구현한다면 Compile ERROR 가 발생한다.

public class SomethingFly implements Bird, Plane {
//compile error
}

 

생각해보면 당연하다 SomethingFly 에서 Bird, Plane 중 어떤 클래스의 fly()를 호출할지 모르기 때문이다. 이처럼 논리적 문제가 발생할 경우 아래와 같이 명시적인 오버라이딩을 통해 해결할 수 있다.

public class SomethingFly implements Bird, Plane {
    @Override
    public void fly() {
       Bird.super.fly();
    }
}

2.static method

인터페이스에 추가된 static 메서드는 우리가 지금까지 사용했던 static method 와 크게 차이점이 없다. 참조로 클래스를 직접 사용하면 인스턴스 변수값을 사용할 수 없다. 아마도 해당 클래스의 연관된 유틸성 함수 용도로 사용을 할때 적절하다고 생각된다. (자바스크립트의 프로토타입과 비슷한 개념같다.) 
아래는 노트를 시속km로 환산하는 static 메서드 예제이다.

public interface Plane {
    default void fly() {
        System.out.println("엔진 점화");
    }
    static double knToKm(double k) {
        return k * 1.852;
    }
}

/////
public static void main(String[] args) {
   final double speedPerHours = Plane.knToKm(10);
}

 

3. default method <-> 접근 제어자 default (public,private,default,protected)

나는 한동안 인터페이스의 추가된 default 메서드와 접근제어자의 default가 같은 건가 틀린 건가 고민했었다. 아래는 오라클 공식 문서에 설명된 그림이다.

 

no modifier 이다. 기존의 많은 레퍼런스 문서에 no modifier 를 default 로 나타냈는데 인터페이스의 default 메서드와 혼란의 여지가 있다(나만 그런가-_-);  아무튼 이 두개는 분명 다른 것이다.

자바 8부터 static 와 default 메서드가 인터페이스가 추가됐고 자바 표준 API 에서 이미 많이 사용됐다. 아마 static 과 default 메서드는 자바 8 부터 추가된 많은 concept 들을 자바에 잘 녹이기 위한 노력의 결과라고 생각된다.

'Java' 카테고리의 다른 글

Java8 New features #4 (LocalDateTime/LocalTime)  (0) 2020.08.28
Java8 New features #3 (Stream)  (0) 2020.08.19
Java8 New features #1(Lambda Expressions)  (0) 2020.08.14
Fork/Join Framework in Java  (0) 2020.06.16
Random Integer List in Java8  (0) 2020.06.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크