[Java] Lambda Expression

Ahnick·2021년 2월 25일
0
post-thumbnail

본 포스팅은 '모던 자바 인 액션'의 내용을 참고하여 작성하였습니다.

Lambda Expression

람다 표현식은, Java8에서 처음 등장한 개념입니다. 자바는 함수형 언어의
장점들을 인지하고, 함수형 프로그래밍의 지원을 위해서 람다 표현식을
Java8에서 도입했습니다.

함수형 프로그래밍이란?

함수형 프로그래밍은 객체 지향 프로그래밍과는 달리, 함수(메소드)를 중심으로
작성되며 객체의 상태 변화와 객체관의 관계를 중심으로 풀어나가는 객체 지향
프로그래밍과는 달리 객체의 불변성을 강조하며
객체 지향이나 절차 지향 프로그래밍에서 발생하는 Side Effect를 배제하고
'예측 가능한' 결과를 도출해내는 프로그래밍 기법입니다.

이러한 함수형 프로그래밍이 얻는 장점은 다음과 같은데

  • 코드의 간결성과 가독성의 향상
  • 유지보수의 편리함
  • 부작용(Side effect)이 없음
  • Thread-Safe 하다
  • 테스트의 편리함을 제공한다

따라서 자바에서는 이런 함수형 프로그래밍의 장점과 발전 가능성을 보고
Lambda라는 함수형 프로그래밍 패턴을 Java8에 도입하였습니다.

Lambda의 구성

람다 표현식은 크게 세 부분으로 나뉘어집니다

(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

<----- 파라미터 ----> + <------- 람다 바디 --------->

앞부분의 파라미터와 뒤의 동작 패턴을 정의한 람다 바디를 ' -> ' 기호를 통하여 구분하고
이와 같은 표현식을 '람다 표현식'이라고 합니다.

기존의 자바 코드와 람다 코드

// 기존 방식의 코드
Comparator<Apple> byWeight = new Comparator<Apple>() {
    public int compare(Apple a1, Apple a2) {
        return a1.getWeight().compareTo(a2.getWeight());
    }
}

// 람다 표현식을 이용한 코드
Comparator<Apple> byWeight = (Apple a1, Apple a2) 
	-> a1.getWeight().compareTo(a2.getWeight());

코드의 간결성이 훨씬 높아진걸 알 수 있습니다. 다음과 같이 람다 표현식을
사용하면 compare 메소드 자체를 전달하듯이 사용 가능합니다.

유효한 람다 표현식

// String 파라미터를 가지고 int를 반환
(String s) -> s.length();

// 150을 기준으로 하는 boolean을 반환
(Apple a) -> a.getWeight() > 150;

// void를 반환
(int x, int y) -> {
    System.out.println("Result:");
    System.out.println(x + y);
};

// 파라미터가 없고, 기본값을 반환
() -> 42;

// 값의 조합
(int a, int b) -> a * b;

// Boolean 표현식
(List<String> list) -> list.isEmpty();

다음과 같이 람다 표현식은 마치 함수를 익명으로 사용하여 결과를 반환하는
익명 함수의 역할을 수행합니다.

결국 람다 표현식도 하나의 객체로 판별되지만, 메소드를 간편하게
작성하여 사용하는것에 목적을 두고 있습니다.

0개의 댓글