함수적 인터페이스

  • 모든 인터페이스를 람다식의 타겟타입으로 사용할 수 없음
  • 람다식은 하나의 메소드를 정의
  • 하나의 추상메소드를 가지는 인터페이스만 람다식의 타겟 타입이 됨 (함수적 인터페이스)
  • 함수적 인터페이스 작성 시 실수를 방지하기 위해 컴파일러가 체킹해 주기를 원하는 경우 @FunctioalInterface 어노테이션을 사용
  • 목적
    • 일회성 -> 익명 객체 함수 -> but 복잡함 -> 간결하게 함수적 인터페이스
@FunctionalInterface // 이 Annotation으로 컴파일시 함수적 인터페이스라고 알림
public interface TestFunctionalInterface {
    public void method();
    public void anotherMethod(); // 컴파일 에러
}

예제1 : 전달인자가 없는 경우

// 예제1-1. MyFunctionalInterface.interface
package com.jremind.exam0625;

@FunctionalInterface
public interface MyFunctionalInterface {
	public void method();
}
// 예제 1-2. FunctionalInterfaceMain.java
package com.jremind.exam0625;

public class FunctionalInterfaceMain {
	public static void main(String[] args) {
		MyFunctionalInterface fi = () -> {
			String str = "method call - 1";
			System.out.println(str);
		};

		fi.method();

		fi = () -> {
			System.out.println("method call - 2");
		};

		fi.method();

		fi = () -> System.out.println("method call - 3");
		fi.method();
	}
}

예제 2: 전달인자가 있는 경우

//예제 2-1. MyFunctionalInterface.interface
package com.jremind.exam0625;

@FunctionalInterface
public interface MyFunctionalInterface {
	public void method(int x);
}
// 예제 2-2. FunctionalInterfaceMain.java
package com.jremind.exam0625;

public class FunctionalInterfaceMain {
	public static void main(String[] args) {
		MyFunctionalInterface fi = (x) -> {
			String str = "method call - 1";
			System.out.println(str);
		};

		fi.method(2);

		fi = (x) -> {
			System.out.println(x*5);
		};

		fi.method(2);

		fi = x -> System.out.println(x*5);
		fi.method(2);
	}
}

예제 3: 반환(return)이 있는 경우

// 예제 3-1. MyFunctionalInterface.interface
package com.jremind.exam0625;

public interface MyFunctionalInterface {
	public int method(int x, int y);
}
// 예제 3-2. FunctionalInterfaceMain.java
package com.jremind.exam0625;

public class FunctionalInterfaceMain {
	public static void main(String[] args) {
		MyFunctionalInterface fi = (x, y) -> {
			int result = x + y;
			return result;
		};
		System.out.println(fi.method(2, 5));


		fi = (x, y) -> {
			return x + y;
		};
		System.out.println(fi.method(2, 5));

		fi = (x, y) -> x + y;
		System.out.println(fi.method(2, 5));

		fi = (x, y) -> sum(x, y);
		System.out.println(fi.method(2, 5));
	}

	public static int sum(int x, int y) {
		return x + y;
	}
}