반응형
- 디폴트 메서드와 정적 메서드
인터페이스의 활용성을 높이기 위해 사용.
디폴트 메서드 - 인터페이스에서 구현 코드까지 작성한 메서드
정적 메서드 - 인스턴스 생성과 상관없이 사용할 수 있는 메서드
- 디폴트 메서드
인터페이스에서 구현하지만, 이후 인터페이스를 구현한 클래스가 생성되면 그 클래스에서 사용함
예약여 default를 사용
사용 예시
지난 계산기 프로그램에 다음을 추가해보자.
일반 함수처럼 작성하고 앞에 default만 붙여주면 된다.
package first_project;
public interface Calc {
...
default void description() {
System.out.println("정수 계산기를 구현합니다.");
}
}
package first_project;
public class CalculatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
CompleteCalc calc = new CompleteCalc();
System.out.println(calc.add(num1, num2));
System.out.println(calc.substract(num1, num2));
System.out.println(calc.times(num1, num2));
System.out.println(calc.divide(num1, num2));
calc.showInfo();
calc.description(); // 디폴트 메서드 호출
}
}
오버라이딩
인터페이스를 구현한 클래스, 혹은 이 클래스를 상속받은 클래스에서 디폴트 메서드를 재정의할 수도 있다.
상속과 동일하게 마우스 우클릭 -> override methods를 클릭하여 재정의 할 수 있다.
- 정적 메서드
예약어 static을 사용
클래스 생성과 무관하게 사용 가능
사용 예시
package first_project;
public interface Calc {
...
static int total(int[] arr) {
int total = 0;
for(int i : arr) {
total += i;
}
return total;
}
}
package first_project;
public class CalculatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
CompleteCalc calc = new CompleteCalc();
System.out.println(calc.add(num1, num2));
System.out.println(calc.substract(num1, num2));
System.out.println(calc.times(num1, num2));
System.out.println(calc.divide(num1, num2));
calc.showInfo();
calc.description();
int[] arr = {1, 2, 3, 4, 5};
System.out.println(Calc.total(arr)); // 정적 메서드 사용
}
}
- private 메서드
자바9부터 인터페이스에 private 메서드를 구현할 수 있음.
private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없음.
따라서 기존 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 private 메서드로 구현하면 코드 재사용성을 높일 수 있음.
private 메서드는 코드를 모두 구현해야해서 추상 메서드에는 예약어 private 사용불가. 하지만 static과는 사용 가능.
private static 메서드는 정적 메서드에서 호출하여 사용
사용 예시
package first_project;
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
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(); // 디폴트 메서드에서 private 메서드 호출
}
static int total(int[] arr) {
int total = 0;
for(int i : arr) {
total += i;
}
myStaticMethod(); // 정적 메서드에서 private static 메서드 호출
return total;
}
private void myMethod() {
System.out.println("private 메서드입니다.");
}
private static void myStaticMethod() {
System.out.println("private static 메서드입니다.");
}
}
결과
15
5
50
2
Calc 인터페이스를 구현하였습니다.
정수 계산기를 구현합니다.
private 메서드입니다.
private static 메서드입니다.
15
댓글