본문 바로가기

JAVA/복습

인터페이스(interface)의 default method

기존 인터페이스는 추상메소드만 가질 수 있었는데 

Java 8 이후는 default method와 static method를 정의할 수 있도록 변경되었다.

 

인터페이스가 default라는 키워드로 선언이 되면 메소드를 구현할 수가 있고,

또한 이를 구현한 클래스 내에서는 default메소드를 오버라이딩 할 수 있다.


Calculator.java

package Java02;

public interface Calculator {
    public int plus(int a, int b);
    public int multiple(int a, int b);
    
    default int exec(int a, int b){
        return a+b;
    }
}

default라는 키워드를 붙여서 메소드를 선언하면 신기하게도 오류가 발생하지 않고 메소드가 구현될 수 있다.

 

default키워드가 없는 메소드는 에러발생

원래 인터페이스는 추상클래스만 가졌었기 때문이다. 하지만 8 이후로는 구현이 가능하다.


Calculator.java

package Java02;

public interface Calculator {
    public int plus(int a, int b);
    public int multiple(int a, int b);

    default int exec(int a, int b){
        return a+b;
    }
}

 

 

MyCal.java

package Java02;

public class MyCal implements Calculator {
    @Override
    public int plus(int a, int b) {
        return a + b;
    }

    @Override
    public int multiple(int a, int b) {
        return a * b;
    }
}

 

MyCalTest.java

package Java02;

public class MyCalTest {
    public static void main(String[] args) {

        Calculator cal = new MyCal();

        cal.plus(5,6);
        cal.multiple(5,6);
        int i = cal.exec(5, 6);
        System.out.println(i);
    }
}

 

-- 실행결과

 

내가 구현한 plus(), multiple()은 사용가능하다.

이런것만 사용가능한 것이 아니라 default로 구현해놓았던 메소드 또한 사용할 수 있다.

 

 

인터페이스가 가지고 있는 메소드가 잘 실행되고 있는것을 확인 할 수 있다.


그런데 왜 java 8에서는 default method를 추가했을까?

 

인터페이스가 변경이 되면 그 인터페이스를 구현하고 있는 모든 클래스들이 해당 메소드를 구현해야하는 문제가 발생한다.

 

이런 문제를 해결하기위해서 인터페이스 내에 메소드를 구현해놓을 수 있도록 추가해놓은것이다.

 

추가적으로 인터페이스에 static method를 가질 수 있다.

 

Calculator.java

package Java02;

public interface Calculator {
    public int plus(int a, int b);

    public int multiple(int a, int b);

    default int exec(int a, int b) {
        return a + b;
    }

    public static int exec2(int a, int b) {
        return a * b;
    }
}

static method 또한 오류를 발생시키지 않는다.

인터페이스에서 정의한 static method는 반드시 인터페이스명.메소드형식으로만 호출해야한다.

 

 

MyCalTest.java

package Java02;

public class MyCalTest {
    public static void main(String[] args) {

        Calculator cal = new MyCal();

        cal.plus(5,6);
        cal.multiple(5,6);
        int i = cal.exec(5, 6);
        System.out.println(i);

        cal.exec2
    }
}

위와 같이 쓸 수 없다.

static method를 호출해서 쓸때에는 인터페이스명.메소드명(); 으로 해주어야 사용할 수 있다.

 

 

MyCalTest.java 

package Java02;

public class MyCalTest {
    public static void main(String[] args) {

        Calculator cal = new MyCal();

        cal.plus(5,6);
        cal.multiple(5,6);
        int i = cal.exec(5, 6);
        System.out.println(i);

        // cal.exec2(); --> 에러
        Calculator.exec2(3,4);
    }
}

 

 

인터페이스에서 static한 method를 선언함으로서 인터페이스를 이용해

간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게된 것이다.