* 그루비 특유의 문법

 

- 그레이들의 빌드 스크립트는 실제로는 그루비 스크립트.

- 하지만 그레이들이 제공하는 DSL 덕분에 그루비를 거의 의식할 필요 없이 빌드 스크립트를 작성할 수 있음.

- 또한, 그루비 문법은 자바와 호환이 되므로 자바를 알고 있다면 문법적으로 어렵지 않음.

- 하지만 그루비 특유의 문법을 모르면 그레이들의 빌드 스크립트를 읽거나 작성할 때 어려움이 있는 것도 사실임.

- 이 글에서는 그루비 문법 중 그레이들에서 자주 사용되는 것만 정리해서 설명함.

 

(1) 문자열

- 문자열 표기 방법에는 크게 다음 두 가지가 있음.

 

1. 작은따옴표(') : 자바의 문자열과 거의 같은 용도

2. 큰따옴표(") : 문자열 내부에 $ 기호로 동적인 내용을 넣을 수 있음. 내부적으로는 그루비의 GString 클래스가 사용됨.

 

- 작은 따옴표 또는 큰따옴표를 세 개 연달아 쓰면 문자열을 여러 줄 표기할 수 있음.

- 구체적인 사용법

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 작은따옴표
String name = 'John'
 
// 큰따옴표
String title = "Project: ${project.name}"
// 큰따옴표 안의 중괄호는 생략 가능
String title = "Project : $name"
// 작은따옴표로 문자열 여러줄 표기하기
String greet = '''***********
                * Hello *
                ***********'''
 
// 큰따옴표로 문자열 여러 줄 표기하기
String banner = """##############################
                   # ${new Date()toGMTString()} #
                   ##############################"""a
cs

 

 

(2) 메서드 호출 시 괄호 생략

- 메서드를 호출할 때 ()를 생략할 수 있음.

- 다음 코드의 결과는 같음.

 

1
2
println('Hello World!')
println 'Hello World!'
cs

 

- 메서드의 인수가 두 개 이상이어도 상관없음. 단, 인수가 없을 때는 ()를 생략할 수 없음.

 

1
2
3
4
5
6
// 인수가 여러 개일 때
printf '%5.3f'345.0
 
// 인수가 없을 때
println     // NG
println()     // OK
cs

 

- 또한, 다음 경우도 ()를 생략할 수 없으니 주의.

 

1
2
3
4
5
6
7
8
// 메서드 호출이 톱레벨(최상위) 식이 아닐 때
println someMethod 'foo'     // NG
println someMethod('foo')    // OK
 
// 메서드 호출이 식의 오른쪽(우변)에 있을 때
def status = someMethod 'foo'    // NG
def status = someMethod('foo')    // OK
 
cs

 

 

(3) def를 이용한 형 지정 생략

- 자바처럼 변수나 인수에 형을 지정할 수도 있지만 생략할 수도 있음.

- 형 지정을 생략할 때는 def 키워드를 이용함.

 

1
2
3
4
5
// 형을 지정한 변수 정의
String name = 'John'
 
// 형을 생략한 변수 정의
def name = 'John'
cs

 

- def를 이용한 형 지정 생략은 변수뿐만 아니라 메서드의 인수나 반환 값에도 적용할 수 있음.

- 또한, 메서드 인수의 형을 생략하면 알아서  def로 간주함.

- def를 지정하는 것은 자바에서 Object 형을 지정한 것과 같음.

- 단, 그루비에는 덕 타치핑(duck typing) 기능이 있어서 형이 def일 때도 객체의 메서드나 속성을 모두 참조할 수 있음.

 

cf) 덕 타이핑은 동적 형의 한 종류로, 객체의 메서드나 속성을 기준으로 객체의 형을 결정함. '만약 어떤 새가 오리처럼 걷고 어리처럼 운다면 그 새는 오리라고 할 수 있다'는 의미로 덕 타이핑이라는 명칭이 붙었음.

 

- 예를 들어 자바에서 다음 코드를 컴파일하면 오류가 발생함.

Object name = "John";

System.out.println(name.toUpperCase());

 

- 하지만 그루비에서는 다음 코드가 아무런 문제 없이 실행됨.

def name = 'John'

println name.toUppderCase()

 

 

(4) 클로저

- 그루비의 기능 중 하나인 클로저(closure)를 제공함.

- 자바 8의 람다(Lambda)나 다른 프로그래밍 언어에서 말하는 함수 객체 정도로 이해하면 됨.

- 클로저는 중괄호 {}를 이용해서 정의하고 <클로저명>.call() 또는 일반 메서드 호출처럼 <클로저명>()으로 실행할 수 있음.

 

1
2
3
4
5
6
7
8
9
10
// 클로저 정의
def clos1 = { mes -> println "Hi, $mes"}
// 인수를 생략하면 암묵적 인수인 it을 사용한다.
def clos2 = { println "Hi, $it"}
 
// 클로저 실행
clos1.call('John')      // Hi, John이 표시된다.
clos2('Bob')            // Hi, Bob 표시된다.
// 메서드 호출과 마찬가지로 괄호를 생략할 수 있다.
clos2 'Alice'           // Hi, Alice가 표시된다.
cs

 

- 그레이들은 클로저를 많이 사용함.

- 다음 태스크 정의는 클로저로 구현한 것임.

 

1
2
3
task hello << {
    println 'Hello Gradle World!'
}
cs

 

- {}로 감싼 부분이 실제로는 클로저임.

- 사전에 정의한 클로저를 이용해서 동일한 태스크를 정의할 때는 다음과 같이 하면 됨.

 

1
2
3
4
5
6
7
8
// 태스크에 추가할 처리를 클로저로 정의한다.
def clos = { println 'Hello Gradle World!' }
 
// 태스크 정의
task hello {}
// 태스크에 클로저 추가
// <<는 leftShift()의 생략형이므로 아래와 같다.
hello.leftShift(clos)
cs

 

내용 출처 : Gradle 철저입문 (와타비키 타쿠마 외 지음, 길벗)

반응형

'In-depth Study > Gradle' 카테고리의 다른 글

그루비 특유의 문법  (0) 2017.07.12
다른 빌드 툴과의 비교  (0) 2017.07.12
그레이들의 장점  (0) 2017.07.12
그레이들의 개요 및 사례  (0) 2017.07.12
빌드 툴(Build Tool)  (0) 2017.07.12
Posted by 별 starrykss

댓글을 달아 주세요