← 목록으로Language

Lambda

람다 함수는 함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수라고도 한다.

목차

1. 람다 함수(Lambda Function)란?

람다 함수는 함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수라고도 한다.

Java 8 부터 지원되며, 불필요한 코드를 줄이고 가독성을 향상시키는 것을 목적으로 두고있다.

2. 람다 함수의 특징

  • 메소드의 매개변수로 전달될 수 있고, 변수에 저장될 수 있다. 즉, 어떤 전달되는 매개변수에 따라서 행위가 결정될 수 있음을 의미한다.
  • 컴파일러 추론에 의지하고 추론이 가능한 코드는 모두 제거해 코드를 간결하게 한다.

3. 람다식 표현

  • 파라미터와 몸체로 구분된다.
  • 파라미터와 몸체 사이에 화살표(->)를 추가하여 람다식을 완성시킨다.
  • 몸체 부분이 단일 행일 경우 중괄호와 return문을 생략할 수 있다.

함수형 인터페이스 (Functional Interface)

람다식이 아무 데나 쓰일 수 있는 건 아니고, 추상 메서드가 딱 하나만 있는 인터페이스(함수형 인터페이스) 자리에만 들어갈 수 있다. 아래에서 볼 new Thread(() -> {...})가 가능한 이유도 Runnable이 추상 메서드 run() 하나만 가진 함수형 인터페이스이기 때문이다.

@FunctionalInterface
interface Calculator {
    int calculate(int a, int b);
}

Calculator add = (a, b) -> a + b;
System.out.println(add.calculate(3, 4)); // 7

@FunctionalInterface 애너테이션은 필수는 아니지만, 실수로 추상 메서드를 2개 이상 추가하면 컴파일 에러로 막아주기 때문에 붙여두는 게 안전하다.

java.util.function 패키지에는 자주 쓰는 함수형 인터페이스가 미리 정의되어 있어서, 매번 인터페이스를 직접 만들지 않아도 된다.

인터페이스 메서드 시그니처 용도
Function<T, R> R apply(T t) 입력을 받아 변환한 결과를 반환
Consumer<T> void accept(T t) 입력을 받아 소비만 하고 반환값 없음
Supplier<T> T get() 입력 없이 값을 생성해서 반환
Predicate<T> boolean test(T t) 입력을 받아 참/거짓 판단
Function<Integer, Integer> square = x -> x * x;
Predicate<Integer> isEven = x -> x % 2 == 0;

System.out.println(square.apply(5)); // 25
System.out.println(isEven.test(4));  // true

이 인터페이스들은 Streammap(), filter() 같은 메서드의 파라미터 타입으로 그대로 쓰이기 때문에, 스트림 코드를 읽으려면 익숙해질 필요가 있다.

4. 익명함수를 람다식으로 변경하기

4. 익명함수를 람다식으로 변경하기

기존 방법

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread!");
            }
        }).start();

람다식

new Thread(() -> {
            System.out.println("Thread!");
        }).start();

예제

값 a, b를 입력 받아 더하기

(매개변수 목록) -> { 람다식 바디 }
public int sum(int a, int b) {
    return a + b;
}

// 람다식 
(a, b) -> a + b;

값 a, b를 입력 받아 더 큰 수 리턴

public int big(int a, int b) {
	if(a > b) return a;
	else return b;
}

// 람다식 문법
(a, b) -> { return a > b ? a : b; }
(a, b) ->  a > b ? a : b

관련 글

Languagever.8LanguageStream에 대해 알아보자LanguageBlockingQueue를 활용한 순차 처리 동시성 제어