Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

시작하기

  • 최신 버전의 자바를 http://java.sun.com 에서 다운로드 받으세요.
  • 인스톨러를 실행합니다.
  • Groovy 배포판을 웹사이트 에서 받아서 하드 디스크에 저장하세요.
  • 배포판 압축을 디스크 어딘가에 풀어주세요. 저는 C:\dev\groovy-1.0-jsr-03 에 풀어 두었습니다.
  • jTDS 데이터베이스 드라이버를 이곳 에서 받은 후, 압축을 풉니다(저는 C:\dev\jtds-1.1 에 풀었습니다). 이 압축파일은 폴더 전체를 묶은 것이 아니라서 압축을 풀기 전에 미리 폴더를 만들어두어야 합니다.
  • JAVA_HOME, GROOVY_HOME, CLASSPATH 환경 변수를 지정해주세요. Windows라면 다음 단계를 따라하세요:
    • 내컴퓨터 등록정보을 열고
    • 고급 탭을 클릭한 후
    • 환경 변수 버튼을 누르세요
    • JAVA_HOME 시스템 변수를 추가하고 자바가 설치된 디랙토리를 입력하세요(제 경우는 C:\Program Files\Java\jdk1.5.0_04 입니다).
    • GROOVY_HOME 시스템 변수를 추가하고 Groovy가 설치된 디랙토리를 입력하세요(저는 C:\dev\groovy-1.0-jsr-02).
    • CLASSPATH 사용자 변수가 없다면 추가하고, 경로에 jTDS jar 파일을 추가하세요(저는 C:\dev\jtds-1.1\jtds-1.1.jar).
    • 명령 프롬프트를 실행하고 "set" 명령을 입력해서 위 환경변수들이 제대로 입력되었는지 확인하세요.
  • Groovy 배포판이 설치된 곳의 bin 디랙토리의 groovyConsole.bat 를 실행하세요. 실행되지 않는다면, 명령 프롬프트를 열고 bin 디랙토리로 이동해서 그곳에서 실행해서 어떤 에러 메시지가 나오는지 살펴보세요.

Hello, World

groovyConsole 창 위쪽에 다음 코드를 입력하세요:

Code Block
println "Hello, World!"

그리고 <CTRL-R> 을 누르세요.
결과는 OS 콘솔창(groovyConsole 창 뒤에 있는 검은 창)에 출력됩니다. 그리고 groovyConsole 아래쪽에는 다음 코드가 출력됩니다.

Code Block
groovy> println "Hello, World!"
null

"groovy>"로 시작하는 줄은 콘솔에 의해 처리된 텍스트 입니다. "null"은 처리 결과를 말합니다. 메시지를 출력하는 명령은 어떠한 "값"도 반환하지 않기 때문에 "null"이 찍힌 것입니다.

이번엔 뭔가 "값"을 갖는 명령을 입력해보지요. 콘솔에 다음 텍스트를 입력하세요:

Code Block
123+45*67

<CTRL+R>을 누르면(앞으로는 <CTRL-R>을 누르라는 말을 생략하겠습니다), 이제 의미있는 "값"이 출력되는 것을 알 수 있습니다.

변수

값을 변수에 입력해놓고 나중에 써먹을 수 있습니다. 아래 코드를 실행해보세요:

Code Block
x = 1
println x

x = new java.util.Date()
println x

x = -3.1499392
println x

x = false
println x

x = "Hi"
println x

Lists 와 Maps

Groovy는 두 가지 중요한 데이터 타입인 List와 Map에 대해서 언어 차원에서 지원하고 있습니다. List는 자바 언어에서 배열을 다루는 것 처럼 다룰 수 있습니다. List는 순서 있는 데이터 모음을 취급하기 위해 사용됩니다. 예를 들어 정수의 목록은 다음과 같이 표현됩니다:

Code Block
myList = [1776, -1, 33, 99, 0, 928734928763]

List에 담긴 항목에 접근하려면 꺾인 괄호를 사용합니다. 인덱스는 0번부터 시작합니다:

Code Block
println myList[0]

위 코드의 결과는 다음과 같습니다:

Code Block
1776

List의 길이를 알고 싶으면 "size" 메서드를 호출하세요:

Code Block
println myList.size()

결과는 다음과 같습니다:

Code Block
6

하지만 보통은 길이를 알아낼 필요가 없습니다. 자바와는 달리 "each" 메서드를 사용하면 List의 모든 항목에 대해 루프를 돌수 있기 때문입니다. 자세한 설명은 아래 "데이터로써의 코드" 부분을 참고하세요.

또 다른 데이터 타입은 Map 입니다. Map은 "associative array" 혹은 "사전(dictionary)"을 표현하기 위해 사용됩니다. 즉 순서는 없고 이름이 붙어있는 데이터의 모음입니다. 예를 들어 이름과 IQ의 쌍을 저장하려고 하면 다음과 같이 씁니다:

Code Block
scores = [ "Brett":100, "Pete":"Did not finish", "Andrew":86.87934 ]

Map에 저장되는 각 값들은 서로 타입이 달라도 됩니다. Brett은 Integer, Pete는 String, Andrew는 부동소수점(floating point) 입니다. Map의 값에 접근하려면 다음 두 가지 방법을 사용할 수 있습니다:

Code Block
 
println scores["Pete"] 
println scores.Pete

결과는 다음과 같습니다:

Code Block
Did not finish
Did not finish

Map에 자료를 추가할 때의 문법은 List에 값을 추가하는 문법과 비슷합니다: 예를 들어 Pete가 IQ 테스트를 다시 받아서 3점을 받았다면 다음과 같이 쓰면 됩니다:

Code Block
scores["Pete"] = 3

이제 다음과 같이 다시 값을 출력해보면:

Code Block
println scores["Pete"]

3이 출력됩니다.

빈 Map이나 빈 List를 만들려면 아래와 같이 하면 됩니다:

Code Block
emptyMap = [:]
emptyList = []

조건적 실행

어떤 프로그래밍 언어에서라도 가장 중요한 기능 중 한가지는 조건에 따라 다른 명령을 실행하는 기능입니다. 가장 간단한 방법은 '''if''' 문을 쓰는 것입니다. 예를 들어:

Code Block
amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
	println("Good morning")
} else {
	println("Good evening")
}

첫번째 줄은 단순히 지금이 오전인지 오후인지를 알아내는 코드이니 별 신경 쓰지 마세요. 코드의 나머지 부분은 다음과 같습니다. 우선 괄호 안의 수식을 평가하고 그 결과가 '''true'''인지 '''false'''인지에 따라 각각 첫번째 코드 블럭 혹은 두번째 코드 블럭을 실행합니다. Boolean 표현식에 대해서는 아래를 참고하세요.

아래와 같이 else 블록은 생략 가능합니다. 하지만 then 블록은 꼭 있어야 합니다:

Code Block
amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
	println("Have another cup of coffee.")
}

Boolean 표현식

거의 모든 프로그래밍 언어에는 진리값 - '''true''', '''false''' - 을 표현하기 위한 특별한 자료형이 존재합니다. 가장 간단한 Boolean 표현식은 앞의 단어들(true 혹은 flase)을 바로 쓰는 것입니다. Boolean 값도 다른 값들처럼 변수에 저장될 수 있습니다:

Code Block
myBooleanVariable = true

더 복잡한 Boolean 표현식은 다음 Boolean 연산자에 의해 표현됩니다:

Code Block
* ==
* !=
* >
* >=
* <
* <=

위 대부분의 연산자는 제법 직관적입니다. 항등 연산자가 '''===''' 인 이유는 대입 연산자인 '''='''과 구분하기 위한 것입니다. 항등 연산자의 반대는 '''!=''' 연산자 입니다. 갖지 않음을 의미합니다.

다음은 예제입니다:

Code Block
titanicBoxOffice = 1234600000
titanicDirector = "James Cameron"

trueLiesBoxOffice = 219000000
trueLiesDirector = "James Cameron"

returnOfTheKingBoxOffice = 752200000
returnOfTheKingDirector = "Peter Jackson"

theTwoTowersBoxOffice = 581200000
theTwoTowersDirector = "PeterJackson"

titanicBoxOffice > returnOfTheKingBoxOffice  // evaluates to true
titanicBoxOffice >= returnOfTheKingBoxOffice // evaluates to true
titanicBoxOffice >= titanicBoxOffice         // evaulates to true
titanicBoxOffice > titanicBoxOffice          // evaulates to false
titanicBoxOffice + trueLiesBoxOffice < returnOfTheKingBoxOffice + theTwoTowersBoxOffice  // evaluates to false

titanicDirector > returnOfTheKingDirector    // evaluates to false, because "J" is before "P"
titanicDirector < returnOfTheKingDirector    // evaluates to true
titanicDirector >= "James Cameron"           // evaluates to true

Boolean 표현식은 '''if'''와 함께 쓰일때 특히 유용합니다. 다음 예를 살펴보세요:

Code Block
if (titanicBoxOffice + trueLiesBoxOffice > returnOfTheKingBoxOffice + theTwoTowersBoxOffice)
{
	println(titanicDirector + " is a better director than " + returnOfTheKingDirector)
}

특히 유용한 검사 중 하나는 변수 혹은 표현식이 null(아무 값도 없음을 의미합니다)인지 검사하는 것입니다. 다음 예제를 살펴보세요:

Code Block
suvMap = ["Acura MDX":"\$36,700", "Ford Explorer":"\$26,845"]
if (suvMap["Hummer H3"] != null)
{
 	println("A Hummer H3 will set you back "+suvMap["Hummer H3"]);
}

null은 일반적으로 어떤 장소에 값이 없음을 나타내기 위해 사용됩니다.

디버깅과 문제해결 팁

  • 변수가 어떤 클래스의 인스턴스인지를 알아보고 싶으면 myVar.getClass() 메서드를 실행하세요. 클래스를 알아냈으면 그 클래스에 대한 문서를 찾아보시기 바랍니다.
  • 복잡한 표현식을 다루다가 문제가 생기면 그 표현식을 단순한 표현식들로 나눠서 각각의 단순한 표현식을 평가해보세요. 그 다음 다시 합쳐서 원래의 표현식으로 만들어내세요.
  • groovyConsole을 재시작 해보세요. 재시작하면 여러분이 만든 모든 변수들이 제거되고 깨끗한 상태에서 다시 시작할 수 있습니다.
  • 관심 있는 주제에 대해서는 Groovy 언어 가이드 에서 찾아보세요.

만약 여러분이 자바 개발자라면: