본문 바로가기
programming_kr/java

JAVA 8 interface 변경사항

by JSsunday 2022. 8. 27.
728x90

등장 배경

인터페이스에 새로운 메서드를 구현하는 경우, 인터페이스를 구현한 구현체가 수십개라면 어떻게 해야 될까요? 아마 모든 구현체에 새로 추가한 메서드를 구현해야 할 것 입니다. 기존의 구현되어 있는 코드를 고치지 않고도 이미 공개된 인터페이스를 변경할 방법은 없을까? 라는 아이디어에서 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 메서드를 구현하지 않았지만 interfacedefault 키워드로 구현되어 있기 때문에 호출해서 사용할 수 있습니다.

 

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-메소드

 

728x90

'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

댓글