30 Mar 2017

람다 표현식의 장점

최근들어 Scala, Javascript와 같은 함수형 프로그래밍 언어들이 많은 주목을 받고 있습니다. 이러한 최신의 함수형 언어들은 람다표현식, 보일러 플레이트, 객체 지향 문법, 모듈화를 지원합니다. 이러한 문법들은 대부분 프로그래머가 더 쉽게 객체 지향 프로그래밍, 함수형 프로그래밍을 할 수 있게 합니다.

그중 람다 표현식은 이름없는 함수를 표현하는 방법입니다. 람다 표현식은 객체지향 언어의 인스턴스 메서드나 클래스 메서드 처럼 파라미터, 반환값, 본문(Body)를 갖고 있습니다. 람다 표현식이 공식적으로 지원된다면 함수를 값으로 사용할 수 있으며 파라미터로 전달할 수 있고 반환값으로 받을 수 있습니다. 이러한 함수는 일급 계층 객체(First-class Object)입니다. (일급 함수, 일급 시민으로도 불립니다.)

//스칼라 익명 함수
//입력받은 정수가 19 이상이면 참 아니면 거짓을 반환한다.
val first = (value: Int) => {
    value > 19
}

개인적으로 자주 사용하는 C#, Java, Javascript에서도 이와 비슷한 문법으로 람다식을 작성할 수 있습니다.

람다 표현식의 등장으로 언어의 표현이 더 풍부해지게 됩니다. 여기서 표현이 풍부해졌다는 것은 다른 방식의 프로그래밍을 할 수 있다는 것이고, 어쩌면 기존보다 더 간결한 프로그래밍을 할 수 있다는 뜻입니다.

그중 가장 큰 장점은 고차함수를 통해 비공통 알고리즘을 파라미터로 받을 수 있는것 입니다. 고차 함수란 함수를 파라미터로 받는 함수를 뜻합니다. 기존에는 객체나 값을 메서드의 파라미터로 전달하여 객체를 이용할 수 있었습니다. 하지만 프로그램의 기능이 많아지면 많아질 수록 길고 복잡하고 인자가 많은 메서드를 작성해야 합니다. 또한 객체가 지원하지 않는 기능들은 외부에서 제어코드를 작성하여야 합니다.

예를들면 프로그램에서 SQL Select 구문처럼 필터링 한 결과값을 가져오는 기능을 개발한다면 필터링을 위해 많은 메서드를 포함시켜야 합니다. 또한 필터링 조건이 복잡하다면 반복자를 이용하여 객체의 외부에서 필터링을 수행해야 할지도 모릅니다.

하지만 람다표현식을 파라미터로 받는 메서드를 만든다면 모든 기능을 고려하여 복잡하게 설계할 필요가 없습니다. 메서드를 사용하는쪽에서 직접 알고리즘을 작성하여 전달할 수 있기 때문입니다. 이러한 방식에는 크게 2가지의 장점이 있다고 생각합니다.

  • 첫째로 모든 기능을 지원하기 위해 하나의 길고 방대한 클래스를 작성할 필요가 없습니다. 변경된 요구사항을 적용한 람다 표현식을 작성하는 것으로 충분합니다.
  • 둘째로 클라이언트가 반복자를 통해 명령형 프로그래밍 스타일로 직접 작성한 코드보다 고차 함수가 버그가 적다는 것 입니다.

람다를 지원하지 않는다면 직접 반복자 코드, 알고리즘, 결과를 받는 콜렉션을 모두 다뤄야 합니다. 미숙한 프로그래머의 경우 실수할 확률이 더 높다고 할 수 있습니다.

그외에도 람다식은 단위 테스트 하기 쉬우며 재사용하기 좋습니다. 이러한 장점은 곧 함수형 프로그래밍 언어들의 장점과 같습니다.

람다표현식은 개발자의 생산성을 높여주는 문법이라고 할 수 있습니다.


Tags:
0 comments