[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하기

댓글을 남겨주세요.

웹플레이어의 향수와 푸념

Posted at 2010.07.23 18:44 // in Language/PHP // by MOOVA 무바㏇
.
2010:07:23 17:24:50

한창 프로그래밍에 취해 있었던 어린 시절 벅스뮤직의 웹플레이어를 보다가, 한번 만들어 보면 어떨까 해서 답습한 자작 웹플레이어다. 해당 커뮤니티에 등록한 날짜를 보니 2004-04-08일 이라고 되어있다. 6년전이라 별로 오래되진 않은 것 같은데, 그 때 밤을 새며 Wnidows Media 6.0 API보며 밤을 지새웠던 열정이 되살아난다. 당시엔 웹플레이어가 한창 뜨고 있던 추세였던 터라 winamp같은 desktop용 플레이어에서 벅스뮤직과 같은 웹플레이어로 사람들이 갈아타고 있는 분위기였다. 당시 개발자들은 취미가 있거나 관심있는 사람들만 이런 번외 분석을 하고 있어서 소통할 수 있는 공간은 오로지 커뮤니티밖에 없었다.

이것을 공개하면서 여러업체들이 웹플레이어 시장을 공략해보자는 제의가 빗발쳤지만, 딱 잘라 말했던 기억이 난다.
"오픈소스니 파는게 아니오~" 라고 말이다. 왜 그랬을까?? 참 배부른 소리했다...


더보기



저때만든 코드를 보니 얼굴이 붉어진다. 코드 하나하나에 주석을 달아 두었다.;;;; 함수네이밍이나 코드컨벤션과 같은 이해도 없었을 뿐더러 레이어의 분할같은 사상적인 개념도 없었던 탓에 스파게티 소스를 커뮤니티 사람들에게 설명하느라고 참 고생한 흔적이 역력하다. 하지만 Event Driven의 개발기법은 알게 모르게 습득한 탓에 이벤트 관련된 부분은 따로 재정의를 해둔것을 발견한다.

더보기



 저 때 만약 Object Programming에 대해서 이해도가 있었다면 아마도 객체로 분할해서 코드를 작성했을 것이다. (하지만 php스크립트에 객체지향 개념이 나왔던게 PHP5였지 아마?) 지난 코드를 구하기도 쉽지만은 않다. 하지만 커뮤니티의 온전한 보호속에 이렇게 고스란히 지난 추억을 되살릴 수 있는 시간이 있어서 좋다. 지난코드를 보고 또 한번 상념에 잠기며 객체 프로그래밍으로 다시 꾸며볼 생각을 하니 또 한번 작은 웃음이 나온다.

그리고 다시 한번 포스팅할꺼리가 늘어났다. "프로젝트내 자바스크립트 컴포넌트 제작"이라는 제목으로 글을 올리려고 하는데
귀차니즘때문에 손이 가질 않는다. 큰맘먹고 조만간 올려드려야지..

공유하고 이야기하고 싶은 것들이 너무나 많다. 블로그에 공개하지 못한 부분들까지 같이 공유하고 싶은 공간이 필요하다. 유난스럽지도 않고 대놓고 상대접을 하는 어려운 장소가 아닌 자연스러운 그런곳 말이다. 인터넷은 기록을 지배하는 장소라서 독자들은 사람이 올린글로 사람을 판단하는 실수를 가끔씩 한다. 그것이 전부가 아닌데도 불구하고 그것을 마치 전부인것 처럼 느끼는 것이 바로 그것이다. 다시한번 말하지만 내 블로그는 격식과 절차 없는, 쓰고 싶을 때 쓰는 그런 장소이고, 풍유가 섞인 그런 곳이다. 내 인생의 2%라고 해야함이 맞다. 블로그로 밥을 먹고 광고하면서 사는 그런 부류가 아니란 이야기다.

최근엔 블로그 작성이 예전만큼 자유롭지가 않다. 보는 눈이 많아졌으니 예의를 갖출 필요도 있는 것이다.
자유스럽게 글을 기재할 수 있는 또 다른 공간이 필요한 시점이기도 하다.



PS :
언젠가 YUI와 Prototype.js를 샅샅히 훑어보고 나름대로 분석해둔 문서가 있었는데,
삼성의 개인 피시 포멧 요구때문에 지금은 내 피시에 없다. (물론 api분석이 아니라 구조론에 대한 분석문서였다.)
젠장.. 프리랜서 피시를 그렇게 무자비하게 포멧을 해 버리다늬..
그럴려면 프리랜서를 고용하지 말던가 말이다.;;; 대놓고 프리랜서를 고용했으면서 대놓고 하는 대접이라니.
하는 짓을 보면 차~암 징하다.




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

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

웹플레이어의 향수와 푸념  (2) 2010.07.23
블로그코리아에 블UP하기
  1. Favicon of http://minimonk.net BlogIcon 구차니

    2010.07.23 21:04 신고 [수정/삭제] [답글]

    헐 저 때문에 부랴부랴 찾아서 올리신글 같아요 ㅋ
    한번 시간내서 뜯어봐야겠습니다 +_+!
    좋은자료 감사합니다!!!!

    • Favicon of http://moova.tistory.com BlogIcon MOOVA 무바㏇

      2010.07.24 00:23 신고 [수정/삭제]

      오랜만에 자바스크립트를 보니 예전 생각이 나서요.ㅎㅎ
      아..정말 공유할 수 있는 개념들이 많은데.. 블로그에 그냥 올리는 것도 그렇고 말이예요. 시간상 다 올릴수도 없고.. 언제한번 스터디나 해볼까요? ㅎㅎ

댓글을 남겨주세요.

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하기

댓글을 남겨주세요.

티스토리 툴바