Shinnara's Blog
Talking with Shinnara :: NaraTalk.com


 Java를 좋아하는 저에게 Groovy는 꽤나 관심이 가는 놈이었습니다. 하지만 여러가지 사정상 제대로 알기가 어려웠지요. 그러던 차에 "Groovy In Action"이라는 책이 인사이트에서 번역서("프로그래밍 그루비")로 출간이 되었습니다. 새해가 되면서 결심한 것 중의 하나가 "매년 새로운 언어에 대해 알아보자" 였기 때문에 책을 사게 되었습니다.

 짬이 나는 시간에 조금 씩 읽기 때문에 진도가 그리 빠르지는 못합니다. 그래도 제대로된 지도자(?)가 옆에 버티고 있으니 예전보다는 보다 체계적으로 알아간다는 느낌입니다.

 프로그래밍 그루비를 읽다가 클로저와 관련된 부분에서 조금 이상한 부분이 있어서, 책을 번역하신 역자이신 박제권 님과 연락이 되었습니다. 주요 내용은 "클로저 내에서 명시적으로 변수 선언을 해야 하는가"였습니다.

논의 되었던 내용을 간단히 정리하자면,

명시적인 클래스 밖에서는 변수 선언을 생략할 수 있다.


프로그래밍 그루비의 예제 2.5에는 클로저를 이용하여 "짠" 소리가 나는 횟수를 세는 코드가 제시되어 있습니다. 여기서 제가 궁금했던 것은 클로저 내에서 변수 선언 없이 변수를 사용하고 있었는데, 그게 가능한 것인가였습니다.

예를 들어 다음과 같은 코드가 있다고 합시다.

1.upto(10) { number ->
 mynumber = number
 println mynumber
}

위 코드를 shownum.groovy 파일에 저장하여 groovy로 실행하거나  groovysh을 이용하게 되면 정상 동작을 합니다.

그러나 아래와 같이,


class MyClosure{

 public void printNumber(){

   1.upto(10) { number ->
    mynumber = number
    println mynumber
   }
 }

}

(new MyClosure()).printNumber()

라고 하게되면 이는 mynumber가 정의되지 않았다며 에러를 발생하게 됩니다.

반면 다음의 코드는 정상  동작을 합니다.


class MyClosure{

 public void printNumber(){

   1.upto(10) { number ->
    def mynumber = number
    println mynumber
   }
 }

}

(new MyClosure()).printNumber()

1.upto(10) { number ->
 mynumber = number
 println mynumber
}

클래스 내부에서는 def를 이용하여 선언하고, 클래스 밖에서는 def 없이 사용을 하였습니다.

즉, 클래스 내부에서 클로저를 사용할 경우 명시적인 변수 선언이 필요하나, 클래스 밖에서는 그렇지 않아도 된다는 것입니다.

아래와 같이

[getsum.groovy]
total = 0

1.upto(100) { number ->
   total += number
}

println "1+ ... + 100 = $total"

명시적인 변수 선언이 없더라도 1부터 100까지의 합인 5050을 정확하게 표시합니다.

그루비에서 클래스로 감싸여 있지 않은 코드에 대해서는 암묵적으로 파일 이름에 해당하는 클래스를 생성하게 되는 데, 이 과정에서 변수 선언이 없이 사용된 변수에 대한 처리도 이루어지는 것으로 보입니다. (보다 자세한 사항은 Groovy Spec을 찾아봐야 겠습니다.)

결과적으로 프로그래밍 그루비의 예제 2.5에 있는 코드는 스크립트 형태로 실행(명시적인 클래스안에 있지 않은 경우)하는 경우, 올바른 코드입니다.

신고
1 Trackback, 0 Comment

댓글을 달아 주세요

1 ··· 24 25 26 27 28 29 30 31 32 ··· 264 
다...... (264)
Computer/Programming (106)
Links (14)
책 읽는 즐거움 (7)
끄적임 (66)
즐거운 과학 나라 (7)
일본 (5)
Study (4)

티스토리 툴바