람다 표현식
이번 포스팅은 함수형 프로그래밍의 꽃이라고 할 수 있는 람다 표현식에 대해 알아보려 합니다.
람다를 사용하는 이유는 계속 전 포스팅부터 봐왔지만 동작파라미터화를 통한 코드의 유연함을 가질 수 있도록 하고, 실행 시 유연하게 작동할 블록에 대하여 간결하게 만들자는 의미에서 등장했습니다.
동작파라미터화가 무엇인지 모른다면? 이곳으로 가서 먼저 보시길 ㅎㅎ
일단 람다(Lambda)가 무엇일까요?
람다는 미적분학의 기호 중 λ (람다 대수)에서 유래되었습니다. 이 것은 함수 정의, 함수 적용, 귀납적 함수를 추상화한 형식 체계를 나타내는데요. 이 뜻대로, 람다가 JAVA8에 구현되었습니다. (익명 클래스를 대체하여, 추상메소드를 전달한다는 점에서 비슷한 것 같네요. ㅡㅡ^)
람다 표현식은 메소드로 전달하는 익명 함수를 단순화 시킨 것으로, 파라미터 리스트, 반환 형식, checked exception 등 기존 메소드 정의 시 해야 했던 것을 모두 해야합니다. JAVA8 IN ACTION에서는 람다의 특징을 다음과 같이 정의했습니다.
1. 익명
보통의 메소드와 달리 이름이 없으니 익명입니다.
2. 함수
클래스에 종속되는 메소드와 달리 함수라고 부릅니다.
3. 전달
매개변수로 전달이 가능합니다. 또한 함수를 변수에 저장할 수 있습니다.
(자바가 자바스크립트 처럼 되어가네요. 이렇게요.)
1 2 3 | var func1 = function() { console.log('변수로 가지고 있는 함수입니다.'); } | cs |
4. 간결성
이건 뭐, 너무 언급해서... 굳이 객체로 감싸지 않아도 됩니다.
람다는 크게 세 부분으로 나누어져 있습니다. (파라미터 리스트, 화살표, 바디)
파라미터 리스트는 말 그대로 매개변수 정의부, 바디는 메소드의 바디, 화살표는 파라미터 리스트와 바디를 연결해주는 것을 말합니다.
(parameter) -> expression
이라 보면 됩니다. expression이 길어진다면 {}을 붙일 수 있습니다.
람다를 통해서, 보통 다음과 같은 일을 할 수 있습니다.
1. boolean 표현식
아래는 파라미터 한개를 받아, boolean을 표현합니다.
1 | (int a) -> a > 5 | cs |
2. 객체 생성
아래는 나이와 이름을 받아, People 인스턴스를 만들고 있습니다.
1 2 3 4 5 6 | (int age, String name) -> { People ret = new People(); ret.setAge(age); ret.setName(name); return ret; }; | cs |
3. 객체 소비 (프로시저)
보통 void 함수와 같은 역할이라 보면 됩니다.
1 2 3 | (People people) -> { System.out.println(people.toString()); }; | cs |
4. 객체에서 선택/추출
객체에서 특정 내용을 추출합니다. (people 객체에서 나이를 선택해서 뽑아냅니다.
1 | (People people) -> people.getAge() | cs |
5. 두 값을 조합
객체에서 두 값을 조합한 결과를 출력합니다.
1 | (int a, int b) -> a + b | cs |
6. 두 값을 비교
두 값을 비교한 결과를 출력합니다.
1 | (int a, int b) -> a >= b | cs |
보통 위와 같은 6가지 패턴으로 주로 사용하고 있으며, 이러한 방법들은 우리가 보통 함수를 만들고 사용하던 방식과 차이가 없어보입니다. (즉 처음 프로그래밍을 배우기 시작하며, 함수라는 개념을 배우던 그 때로 돌아간 것이라 볼 수 있네요. ㅡㅡ^)
다음 포스팅에서는 JAVA8 에서 람다 표현식에 개념과 함께 등장한 함수형 인터페이스와 편의성을 위해 미리 구현된 몇가지의 인터페이스를 보고자 합니다.
|
'개발이야기 > 함수형 프로그래밍' 카테고리의 다른 글
JAVA8 에 정의된 함수형 인터페이스 (0) | 2016.07.28 |
---|---|
함수형 인터페이스 (0) | 2016.07.27 |
동작 파라미터화와 함수형 프로그래밍 (2) (0) | 2016.07.25 |
동작 파라미터화와 함수형 프로그래밍 (1) (0) | 2016.07.25 |
JAVA8 을 눈여겨봐야 하는 이유3 (기타 볼 내용) (0) | 2016.07.22 |