개요

  • JVM 랭귀지
  • 설계자: James Strachan
  • 라이선스: Apache License 2.0

특징

  • Grooby 가 아니라 Groovy
  • 세미콜론 생략 가능
  • 함수 호출시 괄호 생략 가능
  • 타입 생략 가능: def 키워드
  • closure
  • 람다 함수의 기본 변수로 it을 사용
  • 0.1 + 0.2 가 0.3 으로 나온다1.
  • 기타
    • [[gradle]] 빌드 스크립트가 groovy를 쓴다.

install

macOS

brew 만세!

brew install groovy

문법

Comment

java와 똑같다.

String

  • ': 문자열 생성.
  • ": 문자열 생성. perl 처럼 $를 사용해 보간(interpolation)을 할 수 있다.
  • ''': python처럼 여러 줄 String을 만들 수 있다.
  • """: '''과 같지만 interpolation을 할 수 있다.
  • interpolation을 사용할 때 메소드 호출이나 계산 등이 필요하다면 중괄호를 사용하면 된다.
def name = 'John Grib'
def hello = "Hi ${name}"
String hello2 = "Hi $name"
String five = "${2 + 3}"

String test = '''
첫번째 문자열 라인
두번째 문자열 라인
'''

그리고 groovy만의 특징으로 /$/를 사용해 문자열을 선언하는 것도 가능하다.

  • /: 문자열 생성. "와 똑같지만 이스케이핑 처리가 좀 달라서 정규식을 선언할 때 편리하다.
  • $/ /$: 여러 줄 String 생성.

메소드 호출시 괄호 생략

기본적으로는 다음과 같다

println('Hello, world!')
println 'Hello, world!'
printf '%5.2f', 3.14

하지만 perl처럼 메소드 이름만으로 호출할 수는 없다.

인수 없이 호출한다면 ()를 사용해야 한다.

println     // groovy.lang.MissingPropertyException
println()   // 호출 성공

map

def map = [:]
map."name" = "John Grib"

list

def list = [1, "a", true]               // java.util.ArrayList
def linked = [1, 2, 3] as LinkedList    // java.util.LinkedList

array

String[] array = ['one', 'two']

loop

groovy의 루프는 꽤 다양한 편이다.

java와 완전히 똑같은 loop

// 0 부터 99 까지 출력한다
for (i = 0; i < 100; i++) {
   System.out.println(i)
}

// 0, 1, 2를 출력한다
List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
for (Integer num : list) {
   System.out.println(num)
}

in

def list = [1, 2, 3]
for (item in list) {
   println item
}

// in 을 쓰면 map도 돌릴 수 있다
def map = [name:'John', age:'35']
for (item in map) {
    println item.key
    println item.value
}

..

// 0 부터 99 까지 출력한다
for (num in 0..99 ) {
    println num
}

upto, step, times, each

// 0 부터 99 까지 출력한다
def printNumber = {
   println it
}
0.upto(99, printNumber)

// 0, 2, 4, ..., 98 을 출력한다
0.step 99, 2, {
   println it
}

// this is 0, this is 1, ... this is 99 이렇게 100 줄을 출력한다
100.times {
   println "this is ${it}"
}

def list = [1, 2, 3]
list.each {
    println it
}

Endnote