[JAVA] 람다식(lambda expression) 이란?

람다식(lambda expression) 이란?

JAVA 8 부터 람다식(lambda expression) 이 추가 되었다. 
람다식은 말그대로 표현방식 중 하나로 함수형 스타일이라고 할 수 있다.
함수형 스타일은 
함수의 입력만을 의존하여 출력을 만드는 구조로 외부에 상태를 변경하는 것을 지양하는 패러다임으로 부작용(Side-effect) 발생을 최소화 하는 방법론이다.
요약하면 기존의 불필요한 코드를 줄이고 가독성을 향상시키는것에 목적을 두고 있습니다.

함수형 스타일을 이해하기 위해 기존 JAVA 코드(명령형 스타일)와 로 비교를 해보겠습니다.
names 라는 리스트에서 이름이 'S' 로 시작하는사람수를 구하는 소스를 보겠습니다.

기존 JAVA 코드 (명령형 스타일)

    final List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");

    int foundCnt = 0;

    for(String name : names) {

   if(name.startsWith("S")) {

    foundCnt += 1;

    }

    }

    

    System.out.println("이름이 S로 시작하는 사람은 몇명인가요? "+ foundCnt);


람다식 (함수형 스타일)

    final List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");

    System.out.println("이름이 S로 시작하는 사람은 몇명인가요? " + 

    names.stream().filter(name -> name.startsWith("S")).count());

위의 두개의 소스 모두 아래와 같이 동일한 결과가 나옵니다

결과

이름이 S로 시작하는 사람은 몇명인가요? 2 

명령형, 함수형 스타일을 비교하면 소스가 휄씬 간결하다는것을 볼 수 있다. 
따라서 람다 표현식을 사용하면, 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여줍니다.


람다식의 장점

1. 코드를 간결하게 구성할 수 있다.
함수형 버전는 간결하다. 몇줄의 코드만으로 명령형 버전과 같은결과를 낼 수 있다. 여기서 간결하다는 것은 단순의 코드의 줄 갯수 뿐만 아니라 오류가 없고 개발자의 의도를 효과적으로 잘 전달한다는 것을 의미한다.

2. 오류를 줄일 수 있다.
변수의 명시적인 변경이나 재할당의 문제는 버그의 원천이 되고, 이를 동시성을 갖도록 하기에는 무척 어려운 코드가 된다.
위에서 작성한 명령형 코드에서 반복적으로 
foundCnt 를 변경했다. 하지만 함수형 코드에서는 명시적인 변경이 없다. 
변수에 대한 변경이 적다는 것은 코드 안에서 발생할 수 있는 오류의 확률을 더 낮게 한다는 의미이다.

3. 원하는 부분을 병렬화 하기 쉽다.

병렬화를 구현하기는 매우 어려운 작업이다. 태스크를 다중 스레드로 나누고, 결과를  모은 뒤 순차적으로 옮겨야한다. 또한 다른 스레드가 데이터를 업데이트 하는 동안에 스레드간의 충돌이 안되게 해야한다.
말로 보는것 조차 어려워보이는데 람다식을 사용하면 간단하게 메소드를 변경하는것만 으로 구현할 수 있다.





[참조] 자바 8 람다의 힘