🔥 Vamos/Java

1114 | 자바의 정석 기초편 :: ch14-5~14-6

unikue 2022. 11. 14. 21:45

함수형 인터페이스

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

: 람다식을 다루기 위해서 사용

 

 👉 (익명객체인) 람다식의 참조변수를 어떻게 만들어줄 것인가?

1. 함수형 인터페이스 선언

2. 함수형 인터페이스 타입의 참조변수를 가지고 람다식을 다루면 됨

@FunctionalInterface // @애너테이션 붙여주면 검사해줌
interface MyFunction{ // 함수형 인터페이스(단 하나의 추상메서드만 가짐)
	public abstract int max (int a, int b); // 인터페이스의 모든 메서드는 public abstract

// new 조상이름/클래스/인터페이스{멤버} Object대신에 함수형 인터페이스 MyFunction사용
//익명클래스. 클래스의 선언, 객체생성을 동시에
MyFunction f = new MyFunction(){ 
	public int max (int a, int b){ // 오버라이딩규칙 - 접근 제어자는 좁게 못바꾼다 public 꼭 써줘야함
    return a>b ? a: b;}
    };

 // 원래 Object형에는 max가 없어서 에러지만, 현재 함수형 인터페이스의 MyFuction에는 max()가 있어서 가능
 int value = f.max(3,5);

--------------------------------------------------------------
 
 // ** pulic int max()~대신에 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음 (익명클래스 내용 대신에 람다식 사용가능)
(*단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수, 반환타입이 일치해야 함)

MyFunction f = (a, b) -> a > b ? a: b;
int value = f.max(3,5); // 실제로는 람다식(익명함수)이 호출됨. 인터페이스에 있는 max와 맞아야 함

* 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.

 

: 람다식은 메서드. 사용하려면 이름이 있어야 하는데 호출하려고 보니 이름을 다지워놨음.

사용하려면 이름이 필요하긴해서, 인터페이스의 추상메서드를 참조변수를 가지고 람다식에 붙여준다고 보면 됨.(추상메서드를 통해서 람다식을 호출)

 

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

 

👉매개변수로 함수형 인터페이스 사용 가능

👉반환타입으로 함수형 인터페이스 사용 가능

 

👉 즉 람다식을 참조변수로 다룰 수 있다는 것은, 메서드를 통해 람다식을 주고받을 수 있다는 뜻. 변수처럼 메서드 주고받기가 가능해짐.

 

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

class Lamda1{
static void excute (MyFunction f){ // 매개변수 타입이 MyFunction인 메서드
	f.run(); } 

saatic MyFunction getMyFunction(){ // 반환타입이 MyFunction인 메서드
	MyFunction f = () -> System.out.println("f3.run()");
    retufn f; }
    
public static void main (String args[]){
	//람다식으로 MyFuinction의 run()구현
    MyFunction f1 = ()-> System.out.println("f1.run()");
    
    MyFunction f2 = new MyFunction () { // 익명클래스로 run()구현
    public void run() { // public 반드시 붙여야 함
    	System.out.println("f2.run()");
        }
     };
     
     MyFunction f3 = getmyFunction();
     f1.run();
     f2.run();
     f3.run();
     
     excute(f1);
     excute( ()-> System.out.println("run()") ); }
 }