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) 튜토리얼 2 - 데이터로서의 코드 (클로저)
2008-07-11 10:55:05

2008.3.25 translation & editing by gilbird

원문: http://groovy.codehaus.org/Tutorial+2+-+Code+as+data,+or+closures

 

클로저 (Closures)

대부분의 컴파일 언어와 그루비가 다른점의 하나는 고급 객체로 함수를 만들 수 있다는 것이다. 즉 여러 코드 집합을 정의하고 블록으로 감싸서 문자열이나 정수 처럼 사용할 수 있다. 다음 코드를 참고하기 바란다.

square = { it * it }

수식 "it * it" 사이를 중괄호로 묶으면 그루비 컴파일러가 수식을 코드로 간주한다. 컴퓨터공학에서는 이것을 클로저(closure)라고 한다. 이 경우에 지정자 "it"은 함수에 주어진 값을 참조한다. 그리고 나서 컴파일된 함수는 위에 나와 있는 바와 같이 변수 "square"에 값을 할당한다. 이제 다음과 같은 코드를 실행하면

square(9)

81 값이 나온다.

 

이런 방식은 함수 "square"를 값으로 전달할 수 있는지 찾지 못하면 흥미롭지 않다. 내장함수 중에서 함수가 인자인것 처럼 사용할 수 있는 것이 있다. 한 예로 배열에 대한 "collect" 메서드가 있다. 다음을 보자.

[ 1, 2, 3, 4 ].collect(square)

이 수식에서는 배열 1, 2, 3, 4를 만들고 "collect" 메서드를 호출하여 앞에서 정의한 클로저를 전달한다. collect 메서드는 배열의 각 값의 클로저를  호출하여 결과로 다음과 같이 새로운 배열을 만든다.

[ 1, 4, 9, 16 ]

인자로서 클로저를 호출하는 더 많은 메서드는 그루비 JDK(GDK) 문서를 참조하기 바란다.

 

기본적으로 클로저는 "it"이라는 파라메터를 하나 가지고 있으며 클로저에 다른 이름의 파라메터를 만들 수도 있다. 예를 들어 Map.each() 메서드는 키, 값 쌍으로 된 두개의 변수를 가진 클로저를 가져올 수 있다.

printMapClosure = { key, value -> println key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)

결과:

yue=wu
lane=burks
sudha=saseethiaseeleethialeselan
클로저 예제

다음 아래 코드는 클로저 예제이다. 첫번째는 두 가지 측면에 관심을 가져 보기 바란다. 첫째, 클로저가 밖에 있는 변수와 상호작용하고 있다. 즉 클로저가 fullString 변수에 orderParts 배열에서 만든 저장 순서를 추가로 붙여 하나의 문자열로 만들고 있다. fullString 변수는 클로저가 아니다. 둘째, 이 예제에서 특이한 점은 클로저가 익명(anonymous), 즉 이름이 없이 정의한 상태에서 each 메서드를 호출하고 있다. 

fullString = ""
orderParts = ["BUY", 200, "Hot Dogs", "1"]
orderParts.each {
fullString += it + " "
}
println fullString
이 예제에서 출력하는 결과는 추측하기 쉬울 것이다.
다음 예제는 또다는 익명 클로저(anonymous closure)로서 맵에 저장한 값을 합산하는 것이다. 
myMap = ["asdf": 1 , "qwer" : 2, "sdfg" : 10]
result = 0
myMap.keySet().each( { result+= myMap[it] } )
println result
파일 처리
파일에서 데이터를 읽은 것은 비교적 간단하다. 우선 텍스트 파일 myfile.txt를 만들어 보자. 
안에 무것이 있건 상관없다. 간단한 내용을 채우고 C:\temp에 저장한다. 그리고 groovyConsole에서
다음 코드를 입력해 본다.
myFileDirectory = "C:\\temp\\"
myFileName = "myfile.txt"
myFile = new File(myFileDirectory + myFileName)
printFileLine = { println "File line: " + it }
myFile.eachLine( printFileLine )

이 코드는 파일안의 각 라인이 "File line:" 접두어와 출력되어 나올 것이다. 
처음 두 라인은 파일 위치를 가리킨다. 두 변수명을 합쳐서 전체 경로를 만든다.
백슬래시 문자는 그루비에서 특수문자로 취급하므로 백슬래쉬 자체의미로 사용하고자 한다면
두 번 적어야 한다.
다음 라인은 "myFile ="로 시작하며 File 객체를 만든다. 객체는 메서드와 데이터로 구성된다. 
예를 들어 파일 객체는 "c:\temp\myFile.txt"와 같이 파일 위치를 가리키는 데이터와 파일이 있다면
삭제하는 메서드가 있을 것이다. 위 코드는 제일 마지막줄에 나와 있듯이 eachLine 메서드를 사용하는데
각 라인별로 간단한 클로저인 printFileLine가 호출된다. 
문자열 처리
그루비의 문자열은 자바 문자열와 같은 기능을 가지고 있다. 즉 그루비 문자열은 몇가지 기능이
추가된 자바 문자열이다. 따라서 궁금한 점은 String 클래스 자바 문서를 참고해도 된다. 예를 들어
메서드 요약(Method Summary)에서 "split" 메서드를 찾아보도록 하자. 이 메서드는 정규식
(regular expression)을 기반으로 문자열을 나누는 유용한 메서드이다. 정규식은 나중에 자세히 이야기
할 것이며 지금은 가장 간단한 정규식은 문자라는 것이다. 그래서 날짜 "2005-07-04"를 분리하여 1년을
증가시킨 7월 4일을 구해보기로 하자.
stringDate = "2005-07-04"
dateArray = stringDate.split("-")
year = dateArray[0].toInteger()
year = year + 1
newDate = year + "-" + dateArray[1] + "-" + dateArray[2]
위 코드는 앞에서 이야기한 내용이 들어 있으며 두가지 새로운 부분이 있다. 첫째, String에서 
split 메서드를 사용한 것. 둘째, String에서 toInteger()를 호출한 것이다. toInteger를 호출하면
그루비에서 데이터를 정수로 변환한다. ".toInteger()" 없이 실행하면 어떻게 되는지 직접 확인해보기
바란다.
또하나 유의할 사항은 toInteger는 문자열 자바 문서에는 들어 있지 않다. 그 이유는 이 부분은 
그루비에서 추가로 구현한 기능이기 때문이다. 그루비에서 확장한 자바 객체 문서를 참고하기 바란다.
 


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


 
Copyright 2000-2008 KURAPA.COM All Rights Reserved.