Java

[Java] 자바8 default, static 메소드

코리늬 2021. 3. 20. 17:06

자바8에서의 인터페이스

기존 자바7 이하에서는 추상 메소드 선언과 상수 정의만 가능했다.

그런데 자바8부터 default 메소드static 메소드를 추가 정의할 수 있게됐다.

왜 생겼을까???

 

  • default 메소드 왜 생겼지?

하위호환성과 유연성 때문.

만약 자바 7에서 자바8로 업데이트하면서 인터페이스 새로운 메소드가 추가되었다면?

해당 인터페이스를 구현한 모든 클래스에서 해당 메소드를 구현해줘야한다. (너무 불편..)

객체지향의 개방폐쇄원칙에 위배된다.

그래서 default 메소드로 기본 구현을 제공해줌으로써, 새로 구현하지 않아도 된다.

public interface Calculator {

    public int plus(int i, int j);
    public int minus(int i, int j);

    default int multiple(int i, int j){
        return i * j;
    }    
}

########################################
public class CalculatorMain implements Calculator{
    @Override
    public int plus(int i, int j) {
        return i+j;
    }

    @Override
    public int minus(int i, int j) {
        return i-j;
    }

    public static void main(String[] args) {
        Calculator calculator = new CalculatorMain();
        int multipleValue = calculator.multiple(10, 20);
        System.out.println("multipleValue = " + multipleValue);
    }
}

만약 계산기에 더하기, 빼기 기능밖에 없다고 가정해보자.

그런데 이번에 새로운 기능이 릴리즈되어 곱하기 기능이 추가되었다.

그런데 기존의 Calculator 인터페이스를 상속받는 모든 클래스에 재정의 해줘야하는 큰 장애가 발생할 것이다.

하지만 default 메소드를 사용함으로써, 아무일도 없었다는 듯이 곱하기 기능을 사용할 수 있게된다.

 

  • static 메소드 왜 생겼지?

인터페이스 이름.메소드 이름의 방식으로 사용해야하는데, 인터페이스안에 static 메소드를 선언함으로써 인터페이스를 이용해 간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있다.

static 메소드는 override 불가능하다.

또한, public static final 상수를 선언할 때는 static block에서 초기화 할 수 없고, 선언과 동시에 초기화 해야한다.

public interface StaticCalculator {
    public int plus(int i, int j);
    public int minus(int i, int j);

    public static int multiple(int i, int j){
        return i * j;
    }
}

################################################################
public class CalculatorMain implements Calculator{
    @Override
    public int plus(int i, int j) {
        return i+j;
    }

    @Override
    public int minus(int i, int j) {
        return i-j;
    }

    public static void main(String[] args) {
        Calculator calculator = new CalculatorMain();
        int staticMultipleValue = StaticCalculator.multiple(10, 20);
               System.out.println("staticMultipleValue = " + staticMultipleValue);
    }
}

개인적으로 해당 인터페이스에서만 특별하게 사용하기 위해서 추가했어요~ 라는 느낌을 받았다.