본문 바로가기
Programming Language/Java

[자바] 인터페이스 - (2) 요소

by ggyongi 2021. 10. 26.
반응형

- 디폴트 메서드와 정적 메서드

인터페이스의 활용성을 높이기 위해 사용.

디폴트 메서드 - 인터페이스에서 구현 코드까지 작성한 메서드

정적 메서드 - 인스턴스 생성과 상관없이 사용할 수 있는 메서드

 

 

- 디폴트 메서드

인터페이스에서 구현하지만, 이후 인터페이스를 구현한 클래스가 생성되면 그 클래스에서 사용함

예약여 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

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글