기존 인터페이스는 추상메소드만 가질 수 있었는데
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라는 키워드를 붙여서 메소드를 선언하면 신기하게도 오류가 발생하지 않고 메소드가 구현될 수 있다.
원래 인터페이스는 추상클래스만 가졌었기 때문이다. 하지만 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를 선언함으로서 인터페이스를 이용해
간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게된 것이다.
'PL(ProgrammingLanguage) > JAVA' 카테고리의 다른 글
내부클래스 - local 클래스 / 익명클래스 (0) | 2021.10.13 |
---|---|
내부 클래스 - instance 클래스/ static 클래스 (0) | 2021.10.12 |
인터페이스(interface) 사용 (0) | 2021.10.12 |
인터페이스(interface) 정의 (0) | 2021.10.12 |
[프로그래머스] 클래스형변환 실습(2) (0) | 2021.10.11 |