MAIN
여행
지식
낙서연구
Q&A
정보구름
 



L I N K S
KURAPA.COM MAPS
세고비아 길버드 Blog
홈미디어센타 X-Revo
고구마킬러 ㄲㅏㄲㅣ
DaDa의 원초적 잡화
아하! 무진장 알뜰정보
바조의 짜바스크립
일하는엄마 - 워킹맘
네이버,구글맵 지도 검색
세상을 살아가며 궁금한것들
CTICKET - 인생의 쿠폰
Super Coder's Page
똑똑한 검색 ReportBank
MSN Web Messenger
포토웤스(PHOTOWORKS)

믹시
Scouter for KURAPA.COM

0


Translator
Francais (French) Deutsch (German) Espanol (Spanish) Italiano (Italian) Portugues (Portugese) 日本語 (Japanese) 한국말 (Korean) ??中文 (Chinese) العربية (Arabic) Русский язык (Russian) English



> Q&A > Groovy
전체글 수: 12
요즘 뜬다는 그루비(Groovy)... 함께 심층 분석 해보세
그루비(Groovy) - 클로져(Closure)란?
2008-07-11 11:05:22


2008.4.29 translation & editing by gilbird

원문: http://groovy.codehaus.org/Closures

 

gilbird: 위키피디아에서 클로져(Closure)란 함수를 영역안에 묶어 버리는 추상적인 묶음이라고 표현한다. 그루비에서 클로져를 사용하는 방법을 알아보기로 하자.

 

클로져(Closure)란 무엇인가?

그루비 클로져는 코드 블록 혹은 메서드 포인터와 같다. 클로져는 정의 후  나중에 실행할 코드 조각을 말한다.

간단한 예제
def clos = { println "hello!" }
println "Executing the closure:"
clos()                          // "hello!"를 출력한다.

위의 예에서 "hello!"는 클로져를 정의할때가 아니라 호출할때 출력된다는 점에 주목하기 보란다.

클로져는 정의한 영역의 변수에 묶일 수 있다.

def localMethod() {
def localVariable = new java.util.Date()
return { println localVariable }
}
def clos = localMethod()
println "Executing the closure:"
clos()                          //"localVariable"을 정의했을 때 날짜를 출력한다.

파라메터 (Parameters)

클로져 파라메터는 아래와 같이 -> 토큰 앞에 나열한다.

def clos = { a, b -> print a+b }
clos( 5, 7 )                       //"12"를 출력한다.

-> 토큰은 클로져 정의에 파라메터가 하나 뿐이면 생략 가능한다. (gilbird: 아래 It 설명을 보기 바란다.)

명시적 변수(Implicit variables)

클로져 안에서 여러 변수가 특별한 의미로 쓰인다.

It

인자 하나만을 받아들이는 클로져가 있다면 다음과 같이 클로져 정의에서 파라메터를 뺄 수 있다.

def clos = { print it }
clos( "hi there" )              // "hi there"가 출력된다.
this, owner, delegate

this: 자바에서 this는 클로져를 정의한 클래스를 지칭한다.

owner: 둘러싼 객체 (this나 둘러싼 클로져)

delegate: 기본적으로 owner와 동일하지만 builder나 ExpandoMetaClass에서와 같이 변경가능함

예:

class Class1 {
def closure = {
println this.class.name
println delegate.class.name
def nestedClos = {
println owner.class.name
}
nestedClos()
}
}
def clos = new Class1().closure
clos.delegate = this
clos()
/*  출력:
 Class1
 Script1
 Class1$_closure1  */
클로져와 메서드 인자

메서드에서 클로져를 마지막 인자로 받는다면 아래와 같이 클로져를 인라인으로 정의할 수 있다.

def list = ['a','b','c','d']
def newList = []
list.collect( newList ) {
it.toUpperCase()
}
println newList           //  ["A", "B", "C", "D"]

위 예에서 collect 메서드는 List와 클로져 인자를 받아들인다. 위 코드는 아래과 같이 표현할 수도 있다.

def list = ['a','b','c','d']
def newList = []
def clos = { it.toUpperCase() }
list.collect( newList, clos )
assert newList == ["A", "B", "C", "D"]

더 많은 정보

그루비에서는 java.lang.Object를 상속하여 여러 메서드가 클로져와 인자를 받아들이도록 했다. 클로져의 실제적인 사용법에 대해서는 Object를 확장하는 GDK를 참고하기 바란다.

  • 클로져 - 공식적인 정의
  • 클로져 - 비공식적 가이드


태그 : closure , 그루비
추천 : 0, 조회 : 329
코멘트 0 | 트랙백 0 | 첨부파일 1
글자의 색상을 지정합니다 글자의 배경색상을 지정합니다
글자를 진하게 합니다 글자를 기울이게 합니다 밑줄을 긋습니다 취소선을 긋습니다
link를 만듭니다 이미지를 추가합니다 동영상/플래쉬등을 추가합니다 html 코드를 직접 입력합니다
이모티콘을 추가합니다 글박스를 만들거나 글숨김 기능을 추가합니다 html 코드를 직접 입력합니다
html모드로 변환합니다.
 
번호
제목
글쓴이
일자
추천
조회
12
2008-08-04
0
478
11
2008-07-11
0
1,408
10
2008-07-11
0
337
9
2008-07-11
0
330
8
2008-07-11
0
323
7
2008-07-11
0
301
6
2008-07-11
0
292
5
2008-07-11
0
639
4
2008-07-11
0
299
3
2008-07-11
0
383
2
2008-03-29
0
609
1
2008-03-28
0
470


 
Copyright 2000-2008 KURAPA.COM All Rights Reserved.