등장 배경
인터페이스에 새로운 메서드를 구현하는 경우, 인터페이스를 구현한 구현체가 수십개라면 어떻게 해야 될까요? 아마 모든 구현체에 새로 추가한 메서드를 구현해야 할 것 입니다. 기존의 구현되어 있는 코드를 고치지 않고도 이미 공개된 인터페이스를 변경할 방법은 없을까? 라는 아이디어에서 default method가 등장하게 되었습니다.
Java에서 기존의 interface는 추상 메서드만 멤버로 가질 수 있었습니다. 하지만 Java 8 부터 default 키워드를 사용해 interface에 메서드를 선언할 수 있게 되었습니다.
default 키워드
public interface Interface1 {
int add(int x, int y);
default int mul(int x, int y) {
return x * y;
}
}
메서드를 default 키워드를 사용해 선언함으로써 메서드의 구현부를 작성할 수 있게 되었습니다. 위 예시는 두 개의 메서드를 멤버로 갖는 interface이며 mul메서드가 default 키워드로 구현한 메서드입니다.
public class Class1 implements Interface1 {
@Override
public int add(int x, int y) {
// TODO Auto-generated method stub
return x + y;
}
}
해당 interface1을 구현한 Class1에서는, default 키워드로 구현하지 않은 add 메서드만 구현하면 컴파일 에러가 발생하지 않습니다.
public class TestExecuteClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class1 class1 = new Class1();
int result1 = class1.add(2, 3);
System.out.println(result1); // 5
int result2 = class1.mul(3, 4);
System.out.println(result2); // 12
}
}
Class1 class에서 mul 메서드를 구현하지 않았지만 interface에 default 키워드로 구현되어 있기 때문에 호출해서 사용할 수 있습니다.
public class Class1 implements Interface1 {
@Override
public int add(int x, int y) {
// TODO Auto-generated method stub
return x + y;
}
@Override
public int mul(int x, int y) {
return x * x * y;
}
}
필요시에는 위와 같이 default 키워드로 구현된 메서드를 overriding 할 수 있습니다.
static 메소드
public interface Interface1 {
int add(int x, int y);
default int mul(int x, int y) {
return x * y;
}
static void print(int val) {
System.out.println(val);
}
}
또한 Java8 부터 interface에 static 메서드를 선언할 수 있게 되었습니다. 위 Interface1의 print 메서드가 static 메서드입니다.
public class TestExecuteClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Interface1 class1 = new Class1();
int result1 = class1.add(2, 3);
System.out.println(result1);
int result2 = class1.mul(3, 4);
System.out.println(result2);
Interface1.print(result2); //36
}
}
static 메서드는 기존 클래스의 static 메서드처럼 class 이름, 메서드로 호출하는게 아닌 interface 이름.메서드로 호출해야 합니다.
기존의 Java interface에서는 abstract 메소드만을 가질 수 있었던 반면, Java 8 이후부터 Java abstract, default, static 메소드를 정의할 수 있게 되었습니다.
참조
JAVA-8-interface-default-키워드와-static-메소드
'programming_kr > java' 카테고리의 다른 글
제네릭(generic) (1) | 2022.09.24 |
---|---|
JAVA8 Optional 사용법 (1) | 2022.09.17 |
제어자(modifier) (0) | 2022.09.10 |
람다식(Lambda) (0) | 2022.08.30 |
JAVA란? (0) | 2020.12.30 |
댓글