Java9 interface

Java8 ~ 9 Interface

자바8 이전에는 인터페이스의 모든 메서드가 추상 메서드여야 했다. 즉 메서드의 바디가 없어야했다. 하지만 자바8 이후 정적메서드와 기본 메서드를 인터페이스에 넣을 수 있고, 자바9 부터는 비공개 메서드를 사용할 수 있다.

1.정적 메소드

static 메소드는 기존의 companinon class(유틸리티 클래스)에 정적 메소드을 사용하지않고 인터페이스를 사용하게 된다. 아래 인터페이스와 static 메소드의 예시를 보면 메소드를 바로 사용할 수 있는걸 알 수 있다.

package com.acompany.inheritance;

//함수형 인터페이스를 명시 (추상메소드 1개만 존재)
@FunctionalInterface
public interface Payable {

    long paySalary();

    //default 메소드를 선언하여 인터페이스에 구현을 할 수 있다.
    default long payAllowance() {
        callLocal();
        return 0;
    }

    //java 9
    private void callLocal() {

    }

    static long testStatic() {
        return 1;
    }

}

interface는 어노테이션으로 @FunctionalInterface이 선언되어있다. 해당 어노테이션은 함수형 인터페이스를 명시한다.

함수형 인터페이스 : 추상메소드가 1개만 존재하며 이후 포스트에 있는 람다표현식과 관련이 있다.

testStatic()정적 메소드는 아래와 같이 바로 사용할 수 있다.

package com.acompany.inheritance;

public class InheritanceTest {
    public static void main(String[] args) {
        //인터페이스의 static 메소드에 바로 접근하여 사용 가능하다.
        Payable.testStatic();
    }
}

2. 기본 메소드 (default)

인터페이스에서 기본 메소드는 반드시 default 제어자가 붙어야한다. 위에서 구현한 Payable은 추상메소드 paySalary()와 기본 메소드 payAllowance()가 있다. 다른 클래스에서 해당 클래스를 상속할 때 기본 메소드는 오버라이드하여 바로 사용이 가능하다. 또는 인터페이스를 상속 했지만 기본 메소드는 반드시 오버라이드 하지 않아도 클래스가 컴파일된다.

package com.acompany.inheritance;

//만약 abstract 없으면 Payable에 정의된 추상 메소드를 무조건 구현 해야한다.
public abstract class Employee implements Payable {

    protected String name;
    protected long salary;

    public Employee(String name, long salary) {
        this.name = name;
        this.salary = salary;
    }

    //기본 메소드는 반드시 선언하지 않아도 컴파일이 가능하다.
    @Override
    public long payAllowance() {
        return Payable.super.payAllowance();
    }

    public String getName() {
        return name;
    }

    public long getSalary() {
        return salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}

여기서 한가지 살펴볼 점은 classabstract을 추가해준 것이다. 기본메소드는 선언하지 않아도 컴파일이 되지만 Payable인터페이스에는 하나의 추상메소드가 존재한다. 따라서 상속받는 클래스는 오버라이드를 해주어야 하지만 abstract을 추가하면 오버라이드 하지않고도 컴파일이 가능해 진다.

3. 비공개 메소드 (Java9)

비공개 메소드는 인터페이스 자체에 있는 메소드에서만 쓸 수 있으므로, 인터페이스 안에 있는 다른 메소드의 헬퍼 메소드로만 사용할 수 있다. Payable에서 callLocal() 비공개 메소드는 payAllowance() 메소드에서만 사용되고 있다.