Search results for '2014/06/25'

lambda 와 closure 의 차이점 ?

Java SE 8에 도입되기 전부터 관심을 받던 람다식과 closure. 이 둘의 차이는 뭘까?

한마디로 lambda는 이름이 없는 익명 함수( anonymous function ) 를 가르키며,
closure는 하나 이상의 엮인(bound) 변수가 있는 환경에서 실행( or 평가)되는 함수 정도로 이해할 수 있겠다.

자유변수(메소드 파라메터도 아니고 코드 내부에도 저장되지 않는 변수)의 값을 포함하는 코드 블록의 기술용어가 클로저 closure이다.누군가 자신이 사용하는 언어에 클로저가 있다고 흐뭇해한다면, 자바에도 클로저가 있으니 안심해도 좋다. 자바에서는 람다 표현식이 클로저다. 사실 이너 클래스가 클로저로 존재해왔다. 다만, 자바8에서는 매력적인 문법으로 클로저를 제공한다.
- 가장 빨리 만나는 자바8 (길벗) 에서.


두 의미에 대한 깊은 논의는 다음 링크에서 확인 할 수 있음.
http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda
http://www.langdev.org/posts/38

그럼, Clojure 는?
http://clojure.org/ 에서 정의하고 있는것과 같이 JVM(Java Virtual Macine) , CLR(Common Language Runtime), JavaScript 엔진에서의 동작을 목표하는 dynamic programing language. 단어를 처음 접했을 때 정의를 찾아보지 않고, Kroisse님이 알려주기전까지 두 단어가 혼용되어 쓰이고 있다고 적당해 생각해 버렸던게 부끄럽넹...

2014/06/25 15:13 2014/06/25 15:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Clojure는 프로그래밍 언어 이름이고, 말씀하시는 개념은 closure입니다.

  2. Blog Icon
    서비

    Kroisse님. 고맙습니다.
    영미권 검색 시에 Clojure, closure 모두 검색되어서 혼용해서 사용하는 줄 알았습니다. 알려주신 내용으로 좀 더 명확하게 공부하도록 하겠습니다.

java se 8 에서 람다식 사용하기 - 기초

java 8 에 람다 표현식이 도입되면서 closure를 사용하지 않고도 함수형 언어 비슷한 코드를 작성하는게 가능해졌다. 람다 표현식은 이름이 없는 익명 함수를 의미한다.
람다 표현식에 관심을 둬야하는 몇가지 이유는 다음과 같다.
  • OOP 언어인 Java에서 함수형 코드를 작성할 수 있게 해준다.
  • 람다 표현식을 이용함으로써 간결하고 명확한 코드로 그 의도를 표현할 수 있다.
  • Collection filtering, Iteration , Extraction 등에서 놀라운 코드 생산성을 보인다.


아주 아주 기본적인 람다 표현식에 대해 익혀보자.
Syntax
[code javascript](argument) -> (body)[/code]
0개 이상의 인자를 실행하고자 하는 함수 body 로 전달한다는 의미이며, 이는 람다 표현식의 일반적인 구문이다.
예를 들면 다음과 같이 표현된다.
[code javascript](int a, int b) -> a*b
(Person p) -> { return p.getAge();}[/code]

다음 코드는 swing 에서 자주 보이는 이벤트 핸들러를 람다로 변경하는 코드이다.
[code java]btnOk.setOnAction( newEventHandler() {
 @Override
 public voidhandle(ActionEvent e) { //버튼 action에 처리할 코드를 여기에 작성
 }
});[/code]
위 코드를 람다 표현식으로 변경하면 다음과 같다.
[code javascript]btnOk.setOnAction( e -> { //버튼 action에 처리할 코드를 여기에 작성
});[/code]

표현식의 또 다른 예로 익명 클래스는 다음과 같이 작성할 수 있다.
[code java]new Thread(
() -> System.out.println("This is a seperate thread")
).start();[/code]

마지막으로 collection을 다루는 예제만 더 보고 끝내자.
[code java]ArrayList arrayList= new ArrayList<>();
for(int i=1; i<=100; i++)
arrayList.add(i);

//일반적인 for-loop 문
for(Integer i: arrayList)
{ System.out.println(i);
}

//lambda식으로 표현한 for-loop문
arrayList.forEach( i -> {System.out.println(i);});[/code]

이상으로 람다 표현식이 어떻게 코드 수를 줄이고 Java와 함수형 언어 사이의 갭을 매워주는지에 대해 간략히 알아보았다.

2014/06/25 14:32 2014/06/25 14:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다