[Java 7] 재미있는 람다함수 지원

Posted at 2010.09.28 10:44 // in Language/Java // by MOOVA 무바㏇
Java에서 클로저 도입에 대한 이력

2005년 샌프란 시스코에서 개최된 JavaOne의 Technical General Session에거 최초로 언급됨
2006년 Gilad Bracha, Neal Gafter, James Gosling, Petervander Ahe에 의해 공동으로 제안됨(BGGA)
2008년 11월 Devoxx에서 Mark Reinhold가 클로저의 도입을 보류한다고 밝힘.
2009년 11월 Devoxx에서 Mark Reinhold는 클로저의 도입을 부활한다고 밝힘.

Java SE에서 클로저가 필요한 이유 - CPU의 멀티 코어 동향때문

CPU의 멀티 코어 동향이 Java의 lambda함수의 필요성을 촉진 시켰다.. Java는 등장 초기부터 Thread클래스 하위에 다중의 프로세스를 허용하고 있다. J2SE 5.0 Concurrency Utilities는 작업 단위로 병렬 처리를 가능하게 했다. 하지만 CPU의 멀티 코어 동향을 살리기 위해 더 작은 입자도 병렬로 실행하는 체제가 필요했다. 그래서 Concurrency Utilties에서는 보다 세분화된 작은 업무를 취급하기 위해 fork - join 체제를 Java SE7에서 도입 예정이다. fork - join을 실현하기 위해서는 상당히 많은 인터페이스가 있어야 하는데 그래서 주목해야 할 부분이 클로저이다. 클로저로 작업을 하면 유연한 병렬 실행이 자유롭다. 이것이 바로 JavaSE7에서 클로저를 도입하게 된 가장 큰 원인이다.

fork - join  : 포크와 같이 분산되었다가 결국엔 병합되는 큐단위



참고 URL :

Project Lambda



1. 람다식


람다 표현식을 작성하는 방법은 2가지가 있다.

#(인수)(식)
#(인수)(차단)

#이 lambda식의 시작을 나타낸다. 즉 #은 함수를 위한 리터럴이라고 해도 무방하다.
실제로 lambda식을 써 보면

#()(20)

항상 20을 반환하는 람다식이다. 인자가 없으므로 처음 괄호에 아무것도 지정하지 않았다.
물론 단일타입 이외에 객체를 반환할 수도 있다.

# ((new Timestamp ())
# ((new ArrayList <Integer> ())
# (((1, 2, 3))

다음은 인자가 있는 람다식이다.

# (int x) (x + x)
# (int x, int y) (x * y)
# (double time) (new Date (time))

인자가 여러개라면 ,로 구분해서 인자로 넘겨준다. 리턴값은 두 번째 가로에 묶인 식의 결과 값이다.
블록을 작성하는 경우라도 마찬가지이다.

# (int x) (x + x;)
# (int x) (return x + x;)

return을 미지정해도 return값을 받을 수 있으므로 1식과 2식은 같다. 물론 람다식에도 분기문을 사용할 수 있다.

# (int x) (if (x> 0) (return true;) else (return false;))

JavaSE7에서 제안 된 lambda식은 너무나도 쉽고 편하다.

2. 람다함수

람다식은 람다함수로 지정할 수 있다. 람다함수의 정의는 다음과 같다.

# 반환값의 형식 (인수 형식) (throws 예외)


# int () five = # () (5);
# int (int) dbler = # (int x) (x + x);
# int (int, int) multiple = # (int x, int y) (x * y);
# Date (long) timestampFactory = # (long time) (new Timestamp (time));
# boolean (int) booleanCheck = # (int x) (if (x> = 0) (return true;) else (return false;));

# void (String) myLogger = # (String message) (System.out.println (message);)

마지막은 람다 함수의 반환값이 없으면 void로 작성한다. 또한 return문에 람다 식을 직접 사용할 수도 있다.

# double () bar (# double (int) func) (... return # () (Math.random ());)

람다 표현식에 예외를 throw하려면 인수 형식 뒤에 괄호를 사용하여 작성한다.

# String (String) (throws Exception) fileReader = # (String filename) (... throw IOException (); ... return ...;)

3. 람다함수의 실행

2섹션에서 정의한 람다함수를 실행한다.

five() / / 10을 반환
dbler(10) / / 20이 반환
multiple(5, 8) / / 40이 반환
timestampFactory(0L); / / 1970/1/1 00:00 : 00 GMT 나타내는 Date 객체를 반환
booleanCheck(10) / / true를 반환
myLogger( "Hello, World!"); / / Hello, World!가 표준 출력으로 출력된다

메소드의 인자로 람다식을 넘겨줄 수도 있다. 필자가 가장 좋아해야 할 수밖에 없는 부분이 인자에 람다함수를 넘겨주는 방법이다. 만약 자바에 이것만 확실히 도입된다면 정적으로 타이핑했던 프로그램방식이 Python이나 Ruby와 같이 동적인 프로그램으로서의 발전을 기할 수 있으리라 본다.

public int [] map (int [] first, # int (int) func) (
 int [] second = new int [first.length];
 for (int i = 0; i <first.length; i + +) (
  second [ i] = func (first [i]);
 )
 return second;
)


4. 람다의 사용


java는 ActionListener인터페이스와 Runnable 인터페이스와 같이 메소드를 1개만 정의하는 인터페이스가 정말 많다.

예를들어 아래와 같은 식이

Button button = ...;
button.addActionListener( new ActionListener() {
 public void actionPerformed(ActionEvent event) {
  ...
 }
});


아래와 같이 사용된다. 단한줄로 처리할 수 있다는 이야기

Button button = ...; button.addActionListener (# () (/ / 이벤트 처리));

Comparator 인터페이스를 사용하는 sort관련 기능을 보자.

List <String> stringer = ...;
Collections.sort (stringer , new Comparator <String> () (
    public int compare (String first, String second) (
        return first.length () - second.length ();
    )
));

위와 같은 식이 아래와 같이 간단히 바뀐다.

Collections.sort (stringer # (String first, String second) (first.length () - second.length ()));

정말 행복한 코드이다. Python과 Ruby의 sort식과 비슷해졌다. 점점 자바도 스크립트류 언어를 사용하는 개발자들에게 더욱 친숙해져간다.


람다식에서 가장 눈여겨 볼만한 기술은 인자에 람다식을 넘기는 방법인데 이는 다른 스크립트류의 언어에서 볼 수 있는 동적인 타이핑을 가능하게 해 주는 장점을 지니고 있다. yield와 같은 키워드가 제공될지는 아직 미지수지만 필자는 자바의 람다식과 람다함수의 지원을 적극적으로 찬성하고 있는 입장이다.

(필자 주 : 역시나 API는 언제나 변한다. API는 외우는 것이 아니라 감각을 알고 찾아쓰는 것이다:
이 포스트의 키 포인트는 역시나 람다함수의 이점과 자바진형의 동향을 파악하기 위함이다.)


저작자 표시 비영리 변경 금지
신고

'Language > Java' 카테고리의 다른 글

[Java 7] 재미있는 람다함수 지원  (0) 2010.09.28
25+ Free Java FX Books  (0) 2010.01.12
블로그코리아에 블UP하기

댓글을 남겨주세요.

25+ Free Java FX Books

Posted at 2010.01.12 21:03 // in Language/Java // by MOOVA 무바㏇

신고

'Language > Java' 카테고리의 다른 글

[Java 7] 재미있는 람다함수 지원  (0) 2010.09.28
25+ Free Java FX Books  (0) 2010.01.12
블로그코리아에 블UP하기

댓글을 남겨주세요.

티스토리 툴바