함수형 인터페이스

- 함수형 인터페이스 : 단 하나의 추상 메서드만 선언된 인터페이스

- 함수형 인터페이스 타입의 참조 변수로 람다식을 참조할 수 있음.

@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
	public abstract int max (int a , int b);
}

@FunctionalInterface 사용하면 메서드 2개 사용 못함, 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 하기 때문.

 

package lamdaPt;

public class lamda1 {

	public static void main(String[] args) {
//		Object obj = (a, b) -> a > b ? a : b; // 람다식. 익명 객체
		MyFunction f = new MyFunction() {
			public int max(int a, int b) {
				return a > b ? a : b;
			}
		};
		
		int value = f.max(3,5); // 함수형 인터페이스
		System.out.println(value);
	}
		
}

@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
	public abstract int max (int a , int b);
}

함수형 인터페이스 MyFunction을 이용해서 익명 객체를 만들어 오버라이딩 해서 사용 가능

 

value = 5가 찍힌 것을 볼 수 있음.

 

이것을 짧게 만들기 위해서 람다식을 사용해서 바꿔본다 !

 

package lamdaPt;

public class lamda1 {

	public static void main(String[] args) {
		// 람다식(익명 객체)을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
		MyFunction f = (a, b) -> a > b ? a : b;
		int value = f.max(3,5); // 함수형 인터페이스
		System.out.println(value);
	}
		
}

@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
	public abstract int max (int a , int b);
}

람다식 메서드 이름을 지워놨는데, 실제로 호출하려면 이름이 있어야 함.

 

함수형 인터페이스에 가보면 int max 이름이 있으므로 호출이 가능함.


함수형 인터페이스 - example

- 익명 객체를 람다식으로 대체

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list,new Comparator<String>(){
	public int compare(String s1, String s2){
        return s2.compareTo(s1);	
    }
});

이것도 너무 길어서 Comparator에 가보면 

@FunctionalInterface // 이게 붙어있다. 그래서 람다식 사용 가능 !
interface Comparator<T> {
	int compare(T o1, T o2);
}
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list,(s1,s2)-> s2.compareTo(s1));

Comparetor가 함수형 인터페이스 이므로 이렇게 바꿀 수 있다.


마지막 정리

package lamdaPt;

@FunctionalInterface
interface MyFunction2{
	void run(); // 인터페이스 추상 메서드이므로 public static 생략됨!
}

public class lamda2 {
	static void execute(MyFunction2 f) {
		f.run();
	}
	
	static MyFunction2 getMyFunction() {
		return () -> System.out.println("f3.run()");
	}
	
	public static void main(String[] args) {
		// 람다식으로 MyFunction의 run()을 구현
		MyFunction2 f1 = ()-> System.out.println("f1.run()");
		
		MyFunction2 f2 = new MyFunction2() { // 익명클래스로 run()을 구현
			public void run() { // public 안붙이면 default가 기본값인데 조상님이 public이므로 붙여줘야 에러가 나지 않습니다 ★
				System.out.println("f2.run()");
			}
		};
		
		MyFunction2 f3 = () -> getMyFunction();
		
		f1.run();
		f2.run();
		f3.run();
		
		execute(f1);
		execute(()-> System.out.println("run()"));
	}

}

첫 번째 f1은 람다식으로 MyFunction2 함수형 인터페이스의 run()을 구현한 것.

 

두 번째 f2는 익명 클래스로 run()을 구현한 것, 오버 라이딩 필수! 접근 제어자 확인!

 

세 번째 f3는 getMyFunction 메서드를 가지고 오는데 함수형 인터페이스에 접근해서 run을 구현해주는 것

 

마지막 execute는 람다식을 매개변수로 받아서 , 람다식과 주고받는 방법을 보여주는 것

+ Recent posts