Java/객체지향

[객체지향][람다식/Lambda Expression] - 함수형 인터페이스

얄루몬 2022. 3. 9. 00:00

https://youtu.be/0Sp9eFRV8gE?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[함수형 인터페이스]

  • 함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스
  • 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있다.
    • 단 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 한다.

[실습]

package javajungsuk;

public class Java14_0 {

	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);
		//Object 타입의 obj에는 max라는 버튼이 존재하지 않고 형변환이 불가하다.
		//이럴 때 필요한 것이 함수형 인터페이스다.
		System.out.println("value = "+value);
	
	}

}

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

package javajungsuk;

public class Java14_0 {

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

		int value = f.max(3,5);
		System.out.println("value = "+value);
	
	}

}

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

[함수형 인터페이스 타입의 매개변수와 반환타입]

  • 함수형 인터페이스 타입의 매개변수
    • 람다식을 매개변수로 넣어주는 것을 의미한다.
void aMethod(MyFunction f){
	f.myMethode();//MyMethode에 정의된 메서드 호출
}
MyFunction f = () -> System.out.println("myMethod()");
aMethode(f);

aMethod(()-> System.out.println("myMethod()");
  • 함수형 인터페이스 타입의 반환 타입
    • 함수가 반환하는 값이 람다식인 경우를 의미한다.
MyFunction myMethode() {
    MyFunction f = () -> {};
    return f
}

MyFunction myMethod() {
    return () -> {};
}

[실습]

package javajungsuk;

@FunctionalInterface
interface MyFunction {
	void run(); // public abstract void run();
}

public class Java14_1 {
	
	static void execute(MyFunction f) {
		f.run();
	}
	
	static MyFunction getMyFunction() {
		MyFunction f = () -> System.out.println("f3.run()");
		return f;
	}
	
	public static void main(String[] args) {
		MyFunction f1 = () -> System.out.println("f1.run()");
	
		MyFunction f2 = new MyFunction() { //익명클래스로 run() 구현
			
			@Override
			public void run() {
				System.out.println("f2.run()");
			}
		};
		
		MyFunction f3 = getMyFunction();
		
		f1.run();
		f2.run();
		f3.run();
		execute(f1);
		execute(()->System.out.println("run()"));
	}

}