02. 그루비, 자바와의 간단 비교
기본적인 import
그루비는 기본적으로 아래와 같은 패키지를 import 합니다.
- java.io.*
- java.lang.*
- java.math.BigDecimal
- java.math.BigInteger
- java.net.*
- java.util.*
- groovy.lang.*
- groovy.util.*
그루비와 자바의 간단한 비교
- Java is Groovy, Groovy is Java
- A Java Class is a Groovy Class, A Groovy class is a Java Class
위의 두 문장이 현재의 자바와 그루비를 표현하는 가장 적당한 표현입니다.
물론, Full JDK support 이고 바이트 코드 변환 후 돌아가기 때문에 같다라고 봐도 무방하지만 문법적인 차이 몇가지와 그루비 만의 강력한 기능이 추가 되기 때문에 자바와 결합한 그루비는 그 만큼 더 강력한 프로그래밍과 간결한 표기가 가능 합니다.
아래의 코드를 살표보면, 자바와 그루비의 차이점에 대해서 좀 더 명확하게 이해할 수 있습니다.
그냥 단순히 변수에 저장하여 greet라는 메소드를 호출하는 단순한 자바 코드 입니다.
이것을 좀 더 그루비 스럽게 바꾸면 아래와 같습니다. (실행은 그루비 콘솔에서 코드를 작성 한 후 Ctrl + R 을 누르면 됩니다)
같은 기능을 하는 자바 코드(그루비 코드)이지만, 훨씬 더 간결 해졌습니다.
가장 큰 특징은 set, get을 두지 않아도 접근이 가능하다는 것과 String 구문 안에 embed 된 형태의 변수를 정의해서 다이내믹하게 사용할 수 있다는 점입니다.
String greet() { "Hello $name" }
마치 EL 표기를 보는 듯 한 코드를 Java 코드 안에 삽입 한다는 것이지요.
이를 GString이라고 하는데 이 코드는 아래와같이 좀 더 확장된 형태로 사용이 가능합니다.
String dateOut = "Date is ${date.toGMTString()} !" sqlQuery = """ SELECT * FROM DummyTable WHERE year = $date.year """
문자열에 변수표기식($)을 이용해 표현식을 쓴다면 좀 더 쉬운 SQL문장이나 템플릿 용도로 활용할 수도 있을것입니다.
그러면 이러한 결과를 얘기 할 수도 있겠죠.
- Groovy is Java & Groovy is NOT Java
아래의 코드를 보겠습니다.
static void main(args) { def myList = [1,2,"str", "4"] myList.each{ println it } }
주요 포인트는 myList라는 자료형입니다.
이것은 리스트를 정의한 것으로, 혼합형 자료가 autoboxing 같이 처리 되어 변수에 저장할 수 있다는 것입니다.
실행을 해보면 각 변수의 요소를 출력함을 알 수 있습니다.
맵 형태는 아래와 같습니다.
public static void main(args){ Map map = [:] def map2 = ["LEE":"Yion", "Hong":"gildong"] println map2["LEE"] map2["Test"] = "철수" println map2["Test"] }
2 라인에서 map 변수를 초기화 하였고 3라인에서 key:value로 된 자료를 저장하였습니다.
다시 그것을 출력한 후 Test 라는 문자열 Key를 추가한 후 출력한 형태입니다.
어떤가요?
사실 이러한 간결한 문법 보다, 더 강력한 기능은 많지만 문법적으로 자바 개발자도 거부감 없이 접근 할 수 있는 강점이 있습니다.
아래의 코드를 살펴보겠습니다.
println this println this.class println this.class.methods
실행을 해보면 아래와 같습니다.
콘솔에 출력된 결과를 보면 (콘솔에 class를 저장하지 않고 바로 실행하였기 때문에) 자체적인 주소값과 임의의 클래스명, 그리고 기본적으로 import 하는 패키지의 메소드들을 조회할 수 있습니다.
메서드를 출력한 정보를 자세히 보면 wait 이나 toString과 같은 익숙한 상위 메서드들이 확인 됨을 알 수 있습니다.
좀 더 자세히 살펴보겠습니다.
println this println this.class println this.class.methods println this.class.methods.name println this.class.methods.name.grep(~/get.*/) println this.class.methods.name.grep(~/get.*/).sort()
4라인에는 현재 클래스 메서드들의 이름을 반환하고
5라엔에서 이름들의 prefix가 get으로 시작되는 메서드를 출력합니다.
마지막 라인은 순차로 정렬하여 보여주게 됩니다.
결과값을 출력하면 아래와 같습니다.
[getBinding, getProperty, getMetaClass, getClass]
[getBinding, getClass, getMetaClass, getProperty]
이 기능은 Groovy의 GPath 라고 하는데, Java의 Reflection을 통해 프로그램을 작성해 보신 분들이라면 이런 간단한 코드로 수십라인에 대응하는 결과물을 만들어 낼 수 있다는 것에 놀랄 것 입니다.
이 GPath는 객체들의 구조를 탐색하는 강력한 도구입니다. XML 문서를 탐색하는 표준인 XPath에서 이름을 따왔고, XPath처럼 GPath도 아주 짧게, 함축적으로 표현하는것이 주 목적입니다.
이 밖에 Groovy는 Groovlets, Groovy Beans, GroovyMarkup, Groovy Templates 기능을 포함하여 Builders, XML, 정규식, 파일 I/O 와 같은 부분에 있어서 그루비만의 강력한 기능을 확인 할 수 있습니다.
차근 차근 해당 기술에 대해서 알아보도록 하겠습니다.