요깨비's LAB

[Modern Java] Chapter 3. Cumstom Functional Interface 본문

Java/모던 자바

[Modern Java] Chapter 3. Cumstom Functional Interface

요깨비 2019. 12. 26. 18:58

1. Functional Interface Example

public class FunctionalInterfaceExamples {
	public static void main(String[] args) {
		//(i1 + i2 + i3) -> 여기에서 '+'가 들어가는 순간 자동으로 Auto Unboxing이 일어나면서 primitive int가 되기 때문에 String.valueOf()로 변환
		println("Area is ",12,20, (message,height,width) -> String.valueOf((message + (width * height)))); // Area is 240
		println(1L,"JYS", "email.test.com",(id,name,email) -> "User info: ID=" + id + ", NAME=" + name +", EMAIL=" + email); //User info: ID=1, NAME=JYS, EMAIL=email.test.com
	}

	private static <T1, T2, T3> void println(T1 t1, T2 t2, T3 t3, Function3<T1, T2, T3, String> function) {
		System.out.println(function.apply(t1, t2, t3));
	}
}

interface Function3<T1, T2, T3, R> { // 파라미터 3개를 받아서 연산 후 R을 리턴함
	R apply(T1 t1, T2 t2, T3 t3); // Abstract Method가 하나만 있으면 이름이 apply든 apply2든 상관 없다.
}

위의 코드에서 interface 부분을 보겠습니다. apply외의 다른 abstract method를 추가하려고 합니다.

interface Function3<T1, T2, T3, R> { // 파라미터 3개를 받아서 연산 후 R을 리턴함
	R apply(T1 t1, T2 t2, T3 t3);

	void print(int i); // Error
}

당연히 잘 돌아갈 것처럼 보이는 코드입니다. 하지만 에러가 납니다. 왜일까요?
이유는 Abstract Method가 하나만 있어야하는데 2개가 있어서 발생하는 것 입니다. 이러한 에러를 컴파일 타임에서
찾기 위해서 우리는 "이 인터페이스는 Abstract Method를 하나만 있어야 하는 것을 보증한다"는 의미의 표식이 필요합니다.
그것이 바로 @FunctionalInterface입니다.

@FunctionalInterface
interface Function3<T1, T2, T3, R> { // 파라미터 3개를 받아서 연산 후 R을 리턴함
	R apply(T1 t1, T2 t2, T3 t3); // Abstract Method가 하나만 있으면 이름이 apply든 apply2든 상관 없다.
	
//	void print(int i);
}



Comments