java

[java] lambda를 이용해 callback 구현하기

우주유령 2023. 7. 28. 17:32
728x90
반응형

lambda

먼저 lambda에 대한 설명은 여기를 참고하자.

https://wouldyou.tistory.com/63

 

[java] Lambda 람다란?

람다함수 람다함수는 메소드를 하나의 식(Expression)으로 표현하는 것으로 익명함수(Anonymous function)를 생성 한다. 함수형 프로그래밍을 하고자 하며 나왔다고 한다. 자바에서는 메소드 혼자 선언

wouldyou.tistory.com

 

callback만들기

functional interface를 하나 생성해준다.

interface Testable {
  void run();
}

interface를 아래와 같이 구현하면 callback처럼 사용할 수 있다.

public class Example {
  // 인터페이스 Testable로 된 클래스를 실행하는 함수
  public static void test(Testable test) {
    // run 실행
    test.run();
  }
  // 실행 함수
  public static void main(String... args) {
    // 람다식, 익명 클래스의 new의 선언도 없이 바로 run 함수를 실행할 수 있는 표현식
    Testable obj = () -> {
      // 콘솔 출력
      System.out.println("run!");
    };
    // test 함수 실행
    test(obj); //run!
  }
}

 

 

자주 사용되는 interface

interface를 위처럼 만들어도 되지만, 이미 만들어져 있는 것을 가져다 쓸 수도 있다. 주로 Callbale과 Runnable이 많이 쓰인다.

Runnable
Callable

 

Runnable은 단순히 실행만시키고, Callable은 return을 할 수 있다.

 

public class Example {
  // Runnable를 파라미터로 한 함수
  public static void test1(Runnable test) {
    // 함수 실행
    test.run();
  }
  // Callable를 파라미터로 한 함수
  public static <V> V test2(Callable<V> test) {
    // Callable은 throws로 Exception이 설정되어 있음.
    try {
      // Callable에서 설정된 제네릭 값이 반환 타입이다.
      return test.call();
    } catch (Throwable e) {
      return null;
    }
  }
 
  // 실행 함수
  public static void main(String... args) {
    // test1를 람다식으로 설정한 예제
    test1(() -> {
      // 콘솔 출력
      System.out.println("run!");
    });
    // test2를 람다식으로 설정한 예제
    // Callable의 제네릭은 람다식의 return 데이터 타입에 의해 자동 설정
    int data = test2(() -> {
      // int형이기 때문에 test2의 반환 값을 int형으로 자동 설정된다.
      return 10;
    });
    // 콘솔 출력
    System.out.println("data - " + data); 
  }
  
  // run!
  // data - 10
}

 

 

Parameter 넘기기

parameter를 넘기고 싶다면 이렇게 하면 된다.

@FunctionalInterface
public interface MyCallable<V, S, V> {
	V call(S param1, V param2);
}

public class Example {
  public static <V, S, V> void test1(MyCallable<V, S, V> callback, S param1, V param2) {
    callback.call(param1, param2);
  }
 
  // 실행 함수
  public static void main(String... args) {
  	int res = test1((p1, p2) -> p1 + p2, 10, 20); //30
  }
}
728x90
반응형