디폴트 메서드 (자바8 이후)
- 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
- default 키워드 사용
- 구현하는 클래스에서 재정의 할 수 있음
- 인터페이스를 구현한 클래스의 인스턴스가 생성 되어야 사용 가능함
정적 메서드(자바8 이후)
- 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드(자바9 이후)
- 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
- 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
- default메서드나 static 메서드에서 사용함
사용해보기
public interface Calc {
double PI = 3.14;
int ERROR = -99999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
default void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod();
}
static int total(int[] arr) {
int total = 0;
for (int num : arr) {
total += num;
}
myStaticMethod();
return total;
}
}
public class CalcTest {
public static void main(String[] args) {
Calc calc = new CompleteCalc();
int num1 = 223;
int num2 = 20;
System.out.println(num1 + "+" + num2 + "=" + calc.add(num1, num2));
System.out.println(num1 + "-" + num2 + "=" + calc.substract(num1, num2));
System.out.println(num1 + "*" + num2 + "=" + calc.times(num1, num2));
System.out.println(num1 + "/" + num2 + "=" + calc.divide(num1, num2));
calc.description();
int[] arr = {1,2,3,4,5};
System.out.println(Calc.total(arr));
}
}
이미 제공하고 있는 디폴트메서드를 제정의 해보기
package basics14;
public class CompleteCalc extends Calculator {
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
if(num2 == 0) {
return ERROR;
}else {
return num1/num2;
}
}
public void showIngo() {
System.out.println("모두 완료하였습니다.");
}
@Override
public void description() {
System.out.println("오버라이딩된 description");
}
}
private 메서드 사용해보기
public interface Calc {
double PI = 3.14;
int ERROR = -99999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
default void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod();
}
static int total(int[] arr) {
int total = 0;
for (int num : arr) {
total += num;
}
myStaticMethod();
return total;
}
private void myMethod() {
System.out.println("private myMethod");
}
private static void myStaticMethod() {
System.out.println("myStaticMethod");
}
}
- 이미 제정의된 디폴트 메서드는 오버라이딩된 description를 출력하고 있다.
- static 메서드는 잘 출력되는 모습.