기존 인터페이스에서는 abstract method(명세서만) 선언만 할 수 있었지만, java 5부터는 default 및 static method를 선언할 수 있게 되었다.
이후 해당 메소드에 대한 구현과 오버라이딩 또한 가능해졌다.
말 그대로 interface에서 abstract(간단한 명세서) 메소드 작성과 클래스 구현이 나뉘어졌던 방법 이외에도, interface 자체에서도 메소드 구현이 가능하다.
public interface Calculater{
public int plus(int x, int y);
default public int exec(int x, int y){
return x + y;
};
}
public class cal{
public int plus(int x, int y){
return x+y;
};
}
이처럼 interface 상에서 구현한 메소드는 class에서 구현하고, default 메소드의 경우 따로 클래스에서 구현할 필요가 없게 된다.
public class calTest{
public void main(String[] args){
Calculater c = new cal();
c.plus(2,3);
c.exec(1,5);
}
}
이와 같이 메소드를 활용하기 위해 인터페이스를 타입형으로 지정해주고, 참조변수가 클래스 인스턴스를 바라보게 하도록 구현한다면(문법적으로 올바르도록 구현) 해당 참조변수는 클래스로 구현된 메소드와 인터페이스 내부의 default 메소드 모두 사용할 수가 있다.
public interface Calculator{
static int exe2(int x, int y){
return x + y;
}
}
만약 위와 같이 static 메소드를 선언해준다면, 기존 static 활용하듯이 인터페이스를 통해 바로 접근해서 사용해야만 해당 메소드를 사용할 수 있다.
public class CalTest{
public void main(String[] args){
Calculator.exe2 //인터페이스를 통해 직접적으로 접근하고 활용
}
}
기존 인터페이스가 변경되었을 때 모든 class의 구조가 바뀌어야 한다는 단점이 있었다면, default 및 static method 구현 이후엔 따로 선언(class를 통한 구체화) 자체를 할 필요가 없고 바로 메소드를 사용할 수 있다는 점에서 바꿀 필요가 없기 때문에 구현되었다.