Skip to content
Skip to breadcrumbs
Skip to header menu
Skip to action menu
Skip to quick search
Quick Search
Browse
Pages
Blog
Labels
Attachments
Mail
Advanced
What’s New
Space Directory
Feed Builder
Keyboard Shortcuts
Confluence Gadgets
Log In
Sign Up
Dashboard
Groovy
Copy Page
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account. You can also
Sign Up
for a new account.
This page is being edited by
.
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
More colours
Strikethrough
Subscript
Superscript
Monospace
Clear Formatting
Bullet list
Numbered list
Outdent
Indent
Align left
Align center
Align right
Link
Table
Insert
Insert Content
Image
Link
Attachment
Symbol
Emoticon
Wiki Markup
Horizontal rule
tinymce.confluence.insert_menu.macro_desc
Info
JIRA Issue
Status
Gallery
Tasklist
Table of Contents
Other Macros
Page Layout
No Layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard Shortcuts Help
<h2>시작하기에 앞서...</h2> <p>아래 예제들을 실행해보기 전에 우선 다음을 참고하세요:</p> <ol> <li><a class="confluence-link" href="/display/GROOVY/Korean+Installing+Groovy" data-linked-resource-id="54131" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Installing Groovy" data-base-url="http://docs.codehaus.org">Groovy를 설치하고</a></li> <li><a class="confluence-link" href="/display/GROOVY/Korean+Embedding+Groovy" data-linked-resource-id="54156" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Embedding Groovy" data-base-url="http://docs.codehaus.org">임베딩하고</a></li> <li><a class="confluence-link" href="/display/GROOVY/Korean+Running" data-linked-resource-id="54237" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Running" data-base-url="http://docs.codehaus.org">실행해보세요.</a></li> <li><a class="confluence-link" href="/display/GROOVY/Korean+Groovy+CLI" data-linked-resource-id="54238" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Groovy CLI" data-base-url="http://docs.codehaus.org">명령행</a> 을 통해 쉘 스크립트 모드로 실행하거나</li> <li>보통의 자바 프로그램처럼 <a class="confluence-link" href="/display/GROOVY/Korean+Compiling+Groovy" data-linked-resource-id="54242" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Compiling Groovy" data-base-url="http://docs.codehaus.org">컴파일해서</a> 실행하거나</li> <li><a class="confluence-link" href="/display/GROOVY/Korean+Bean+Scripting+Framework" data-linked-resource-id="54240" data-linked-resource-type="page" data-linked-resource-default-alias="Korean Bean Scripting Framework" data-base-url="http://docs.codehaus.org">Bean Scripting Framework</a> 을 이용하여 Groovy를 자바 코드 안에 포함시킬 수도 있습니다.</li> </ol> <h2>첫번째 Groovy</h2> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> //hello.groovy println "hello, world" for (arg in this.args ) { println "Argument:" + arg; } // 이건 주석이고 /* 이건 블럭 단위 주석 입니다. 아래처럼 할 수도 있습니다: this.args.each{ arg -> println "hello, ${arg}"} */ </pre></td></tr></table> <p>명령행에서 위 코드를 실행하려면 다음과 같이 하세요:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> groovy hello.groovy MyName yourName HisName </pre></td></tr></table> <h2>개괄</h2> <p>Groovy 클래스는 결국 자바 바이트 코드로 컴파일 되기 때문에 Groovy 클래스와 자바 클래스 사이에는 일대일 대응이 성립합니다. 사실 모든 Groovy 클래스는 보통의 자바 코드 안에서 그대로 쓰일 수 있습니다. 왜냐하면 Groovy 클래스도 자바 클래스이기 때문입니다.</p> <p>Groovy의 장점을 파악할 수 있는 가장 쉬운 방법은 콜랙션을 다루는 코드를 실험해보는 것입니다. Groovy에서는 List(java.util.List)와 Map(java.util.Map)이 모두 문법상 first class 객체입니다. 따라서 객체의 List를 생성하려면 아래와 같이 하면 됩니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def list = [1, 2, 'hello', new java.util.Date()] assert list.size() == 4 assert list.get(2) == 'hello' assert list[2] == 'hello' </pre></td></tr></table> <p>모든 것이 객체라는 점을 주목하세요(숫자의 경우 자동 박싱이 적용됩니다). Map을 만들려면 아래와 같이 합니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def map = ['name':'James', 'location':'London'] assert map.size() == 2 assert map.get('name') == 'James' assert map['name'] == 'James' </pre></td></tr></table> <p>콜랙션을 순회(iterate)하는 것도 쉽습니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def list = [1, 2, 3] for (i in list) { println i } </pre></td></tr></table> <p>일단 콜랙션을 만들었으면 Groovy의 새로운 콜랙션 지원 메서드(hepler methods)나 클로저를 사용해볼 수 있습니다.</p> <h2>클로저(closure) 사용하기</h2> <p>클로저는 자바의 내부 클래스(inner class)와 비슷합니다. 단 클로저는 임의의 인자를 갖는 실행 가능한 단일 메서드라는 점이 다릅니다. 클로저는 원하는 만큼의 인자를 가질 수 있습니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def closure = { param -> println("hello ${param}") } closure.call("world!") closure = { greeting, name -> println(greeting + name) } closure.call("hello ", "world!") </pre></td></tr></table> <p>-> 표시 이전에 아무런 인자도 지정하지 않으면 'it'이라는 이름의 기본 인자가 사용됩니다. 아래 예제를 참고하세요:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def closure = { println "hello " + it } closure.call("world!") </pre></td></tr></table> <p>클로저를 이용하면 아래와 같이 콜랙션(Array, Map, String, File, SQL connection)을 더 깔끔하게 쓸 수 있습니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> [1, 2, 3].each ({ item -> print "${item}-" }) ["k1":"v1", "k2":"v2"].each {key, value -> println key + "=" + value} </pre></td></tr></table> <p><strong>참고:</strong> 메서드의 마지막 인자가 클로저인 경우 클로저의 정의는 괄호 밖으로 빠져나갈 수 있습니다. 아래 코드들을 살펴보세요:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def fun(int i, Closure c) { c.call(i) } // 클로저를 괄호 밖으로 빼기 [1, 2, 3].each() ({ item -> print "${item}-" }) fun(123) { i -> println i } // 괄호 생략 [1, 2, 3].each ({ item -> print "${item}-" }) // 일반적인 용법 [1, 2, 3].each(({ item -> print "${item}-" })) def closure = { i -> println i} //[1, 2, 3].each() closure // 에러. 클로저를 이미 정의했음 </pre></td></tr></table> <p>다음은 콜랙션과 String에서 쓸 수 있는 지원 메서드들입니다.</p> <h3>each</h3> <p>클로저를 이용하여 순회:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> [1, 2, 3].each { item -> print "${item}-" } </pre></td></tr></table> <h3>collect</h3> <p>콜랙션의 각 아이템에 대해 클로저를 호출하고 그 결과를 수집:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].collect { it * 2 } assert value == [2, 4, 6] </pre></td></tr></table> <h3>find</h3> <p>클로저로 주어진 조건(predicate)과 일치하는 첫번째 아이템을 반환:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].find { it > 1 } assert value == 2 </pre></td></tr></table> <h3>findAll</h3> <p>클로저로 주어진 조건과 일치하는 모든 아이템을 반환:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].findAll { it > 1 } assert value == [2, 3] </pre></td></tr></table> <h3>inject</h3> <p>첫 반복(iteration)에서 사용할 값을 인자로 넘기고 그 반복에서 처리한 결과를 다음 반복으로 넘기는 것을 되풀이합니다. 셈을 할 때에 특히 유용합니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].inject('counting: ') { str, item -> str + item } assert value == "counting: 123" value = [1, 2, 3].inject(0) { count, item -> count + item } assert value == 6 </pre></td></tr></table> <p>이에 더하여 콜랙션에 대한 부울린 로직을 수행하는 두 개의 메서드도 제공됩니다.</p> <h3>every</h3> <p>콜랙션의 모든 요소가 클로저에 의해 제공되는 술어(predicate)를 만족하면 참을 반환합니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].every { it &lt; 5 } assert value value = [1, 2, 3].every { item -> item &lt; 3 } assert ! value </pre></td></tr></table> <h3>any</h3> <p>콜랙션의 요소 중 어떤 한 가지라도 클로저에 의해 제공되는 술어를 만족하면 참을 반환합니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].any { it > 2 } assert value value = [1, 2, 3].any { item -> item > 3 } assert value == false </pre></td></tr></table> <p>기타 지원 메서드에는 다음과 같은 것들이 있습니다.</p> <h3>max / min</h3> <p>Comparable을 구현한 객체의 콜랙션에 대하여 최대값(max) / 최소값(min)을 반환합니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> value = [9, 4, 2, 10, 5].max() assert value == 10 value = [9, 4, 2, 10, 5].min() assert value == 2 value = ['x', 'y', 'a', 'z'].min() assert value == 'a' </pre></td></tr></table> <h3>join</h3> <p>콜랙션의 모든 값을 연결하여 하나의 문자열로 만들어줍니다:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> def value = [1, 2, 3].join('-') assert value == '1-2-3' </pre></td></tr></table>
Please type the word appearing in the picture.
Attachments
Labels
Location
Watch this page
< Edit
Preview >
Loading…
Save
Cancel
Next hint
search
attachments
weblink
advanced