Groovy란?
Groovy란 JVM위에서 동작하는 동적 타입 프로그래밍 언어이다. Java뿐만 아니라 Python, Ruby 등에 많은 영향을 받은 프로그래밍 언어로 문법이 간결하다. 하지만, 사실상 대부분 Gradle Script를 작성하기 위해 사용되고 있으며, Gradle Kotlin이 등장하고 나서는 Gradle Groovy를 Gradle Kotlin으로 많이 전환하는 추세이다. Java 생태계의 대부분인 Android나 Spring이 Kotlin으로 작성 가능한데, Build Script 작성을 위해 별도의 언어를 배운다는 점이 부담스럽기 때문이다. 또한 Groovy는 별도로 프로젝트를 구성하지 않으면 자동완성이 안된다는 문제가 있어 자동완성이 되는 Kotlin으로 빌드 스크립트를 작성하는 것이 최근 추세이다.
하지만 여전히 많은 Spring이나 Android 프로젝트들에서 Gradle Script들을 Groovy로 작성해놓았고, 수십년간 Groovy가 Kotlin과 혼용될 것이다. 익숙해진 언어를 바꾸는 것은 개발자에게 큰 모험이기 때문이다. 따라서 이번 글에서는 Groovy 스크립트 이해를 위해 다양한 Groovy 문법들을 살펴볼 것이다.
*Groovy 실행환경 설정이 안되어 있다면 https://kotlinworld.tistory.com/319 글을 참조하길 바란다.
Groovy datatypes
- Groovy는 변수의 Data Type을 정의하기 위해 별도의 타입을 구체적으로 정의할 필요 없다. def로 선언하면 똑똑한 컴파일러가 타입을 추론하기 때문이다. 물론 구체적으로 지정해도 상관없다.
class MyGroovy {
static void main(String[] args){
def kotlinWorldDef = "Kotlin World"
String kotlinWorldString = "Kotlin World"
}
}
- Groovy에서 사용하는 클래스는 모두 Java Class에 대응된다. 예를 들어 Groovy의 String의 클래스를 출력해보면 java.lang.String이 나온다.
class MyGroovy {
static void main(String[] args){
def kotlinWorldDef = "Kotlin World"
println(kotlinWorldDef.class)
// 결과 java.lang.String
}
}
Groovy Strings
- 여러 줄로 이루어진 문자열을 넣기 위해서는 java나 kotlin과 똑같이 """ """을 쓰면 된다.
class MyGroovy {
static void main(String[] args) {
def kotlinWorldHello =
"""
hello
kotlin world
"""
println(kotlinWorldHello)
}
}
- Kotlin과 똑같이"${변수}"를 사용해 String을 치환할 수 있다.
class MyGroovy {
static void main(String[] args) {
def kotlinWorld = "Kotlin World"
println("Hello ${kotlinWorld}")
//결과 Hello Kotlin World
}
}
- ==~ 으로 패턴을 비교한다.
class MyGroovy {
static void main(String[] args) {
def kotlinWorld = "support@kotlinworld.com"
def emailPattern = /([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})/
println(kotlinWorld ==~ emailPattern)
//결과 true
}
}
Groovy Closure
- groovy의 closure은 java나 Kotlin의 lambda이다. lambda식과 똑같이 사용 가능하다.
class MyGroovy {
static void main(String[] args) {
def closure = { number ->
println(number)
}
closure(10)
//출력 10
}
}
- groovy의 closure은 default value 의 설정이 가능하다. default value가 설정되어 있으면 인자를 넘기지 않아도 된다.
class MyGroovy {
static void main(String[] args) {
def closure = { number = 5 ->
println(number)
}
closure()
//출력 5
}
}
Groovy Collections
- groovy에서 ArrayList는 []으로 선언한다.
class MyGroovy {
static void main(String[] args) {
def arrayList = [1, 2, 3]
}
}
- groovy의 Set은 list에 toSet() 메서드를 사용해 만든다. as Set으로 타입 캐스팅으로 만들 수도 있다.
class MyGroovy {
static void main(String[] args) {
def set = [1, 2, 3, 1].toSet()
println(set)
}
}
- groovy의 map은 [key1:value1, key2:value2 ...] 으로 만든다. key는 기본적으로 String이며, ""을 안 붙여줘도 String이 된다.
class MyGroovy {
static void main(String[] args) {
def map = [blogName: "Kotlin World", number: 2]
}
}
- map의 value 값으로 접근은 [key], .key, .get(key) 를 통해 가능하다.
class MyGroovy {
static void main(String[] args) {
def map = [blogName: "Kotlin World", number: 2]
map["blogName"]
map.blogName
map.get("blogName")
}
}
Groovy Methods
- 메서드의 정의는 java 와 똑같이 한다. 다른 점은 return을 명시적으로 하지 않아도 마지막 줄이 return 값이 된다는 것이다.
[return type] [method 명]([파라미터]) {
[return 값]
}
예를 들어 다음과 같이 사용 가능하다.
int add(int x, int y) {
x+y //return 값
}
- 메서드는 [메서드명] [파라미터] 를 써서 실행이 가능하다. 예를 들어 다음과 같이 실행 가능하다.
class MyGroovy {
static void main(String[] args) {
def x = 1
def y = 2
def result = add x,y
println(result)
//결과 3
}
static int add(int x, int y) {
x+y //return 값
}
}
Groovy Class
- class는 def를 사용해 내부에서 사용하는 파라미터를 정의한다.
class clazz명{
def param1, param2, param3
}
예를 들어 다음과 같이 사용 가능하다.
class Blog {
def blogName, url
}
- 객체 생성은 new 클래스명(파라미터명: 파라미터값 ..) 으로 가능하다.
class MyGroovy {
static void main(String[] args) {
def blog = new Blog(blogName: "KotlinWorld", url: "kotlinworld.com")
print blog.blogName
}
}
반응형