아파치 그루비
동적 객체 지향 프로그래밍 언어의 하나
(그루비 (프로그래밍 언어)에서 넘어옴)
그루비(Groovy)는 자바에 파이썬, 루비, 스몰토크 등의 특징을 더한 동적 객체 지향 프로그래밍 언어이다.
패러다임 | 다중 패러다임 |
---|---|
설계자 | 제임스 스트라칸 |
개발자 | 글라우미 라포어 |
발표일 | 2003년 |
최근 버전 | 4.0.5 |
최근 버전 출시일 | 2022년 9월 6일[1] |
미리보기 버전 | 4.0.0-beta-1 |
미리보기 버전 출시일 | 2021년 9월 6일[1] |
자료형 체계 | 불규칙, 동적 타이핑 |
운영 체제 | 자바 가상 머신 |
라이선스 | 아파치 허가서 2.0 |
웹사이트 | http://www.groovy-lang.org/ |
주요 구현체 | |
Groovy | |
영향을 받은 언어 | |
자바, 루비, 파이썬, 스몰톡 | |
영향을 준 언어 | |
제이루비 |
특징
편집역사
편집2002년 영국 출신의 프로그래머인 제임스 스트라칸에 의해 창시되었으며 현재 아파치 사용 허가서 2.0 아래에 소스와 바이너리가 배포, 공개되어 있다. 2012년 6월 2일 2.0버전이 출시되었다.
철학
편집그루비의 창시자 제임스 스트라칸은 그루비의 가장 중요한 점이 타입이 유연 간결한 동적인 프로그래밍 언어라고 한다.
자바와의 비교
편집그루비의 문법 체계는 자바의 것을 계승 발전시켰다. 자바에는 없는 간편 표기법(syntactic sugar)을 지원하는 외에 리스트, 맵, 정규식을 위한 구문을 제공함으로써 프로그래밍을 쉽고 간결하게 해 준다. 더구나 LISP 언어 초기부터 있어 왔던 클로저를 도입함으로써 메타프로그래밍이 가능하게 하였다. 자바가상기계(JVM) 상에서 동작하는 동적인 스크립팅 언어 Jython, JRuby, Jacl, Rhino, LuaJava 등에 비해 손색이 없으며, 짧은 역사에도 불구하고 빠른 발전을 하고 있다.
자바 소스는 컴파일해야만 사용할 수 있지만, 그루비 소스는 스크립트 파일 그대로 실행시킬 수도 있고, 자바처럼 컴파일하여 쓸 수도 있다. 거의 대부분의 자바 소스는 파일 확장자만 바꾸면 수정 없이 그루비에서도 쓸 수 있다.
다음은 표준 Java 5+의 예제이다.
public class StdJava
{
public static void main(String argv[])
{
for (String it : new String [] {"Rod", "Carlos", "Chris"})
if (it.length() <= 4)
System.out.println(it);
}
}
그루비를 사용하면 아래처럼 간단하게 표현할 수 있다.
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
도구
편집groovy
편집- 가장 많이 쓰는 그루비 스크립트 실행 도구
- 실행 예: groovy hello.groovy
groovyc
편집- 자바 쪽에서 불러 쓸 수 있는 라이브러리 만들 때 쓰는 그루비 컴파일러
- 내용은 자바 소스와 거의 같으나 파일 확장명을 groovy로 하여 저장한다.
(소스 파일명: HelloWorld.groovy)
public class HelloWorld {
public static void main(String[] args) {
println "Hello, World!"
}
}
- 미리 환경변수 CLASSPATH를 설정한다. (java로 실행할 때 필요함)
- 윈도
>set CLASSPATH=%GROOVY_HOME%\embeddable\groovy-all-1.7.3.jar
- 유닉스/리눅스
$ export CLASSPATH=$GROOVY_HOME/embeddable/groovy-all-1.7.3.jar
- 윈도
- 컴파일
>groovyc -d . HelloWorld.groovy
- 실행
>java -classpath .;%CLASSPATH% HelloWorld
groovysh
편집- 간단한 코드를 테스트하는데 좋은 그루비 쉘
>groovysh
Groovy Shell (1.7.3, JVM: 1.6.0_21)
Type 'help' or '\h' for help.
-------------------------------------------------------------------------------
groovy:000> println "Hello"
Hello
===> null
groovy:000> exit
예제
편집기본적인 코드
편집- 그루비에서는 거의 모든 것이 객체이다.
- 문자열 객체
groovy:000> "Groovy is groovy".length()
===> 16
groovy:000> "Rick".indexOf("k")
===> 3
- 클래스의 정적 메소드(static method) 호출
groovy:000> Math
===> class java.lang.Math
groovy:000> Math.abs(-75)
===> 75
컬렉션(collection)
편집리스트(list)
편집groovy:000> a = [1, 'hi', 3.14, 1, 2, [4, 5]]
===> [1, hi, 3.14, 1, 2, [4, 5]]
groovy:000> a[2]
===> 3.14
groovy:000> a.reverse()
===> [[4, 5], 2, 1, 3.14, hi, 1]
groovy:000> a.flatten()
===> [1, hi, 3.14, 1, 2, 4, 5]
groovy:000> a.flatten().unique()
===> [1, hi, 3.14, 2, 4, 5]
맵(map)
편집groovy> hash = ['water': 'wet', 'fire': 'hot']
groovy> println hash['fire']
groovy> hash.each { key, value ->
groovy> println "${key} is ${value}"
groovy> }
hot
water is wet
fire is hot
Result: ["water":"wet", "fire":"hot"]
제어구조
편집groovy> if ("fablic".length() > 3)
groovy> println 'ya'
groovy> else
groovy> println 'nop'
ya
groovy> def n = 0
groovy> while (n < 3){
groovy> println n++
groovy> }
0
1
2
- 일부 제어구조는 반복자(iterator)로 대신할 수 있다.
클로저(closure)와 반복자(iterator)
편집반복 처리
편집- 리스트의 각 요소로 반복 처리
- 클로저를 사용하지 않는 경우
groovy> def list = [1, 2, 5, 13, 21]
groovy> def n = 0
groovy> while (n < list.size()) {
groovy> list[n++] *= 2
groovy> }
groovy> list
Result: [2, 4, 10, 26, 42]
- 클로저를 사용한 경우
groovy> def list = [1, 2, 5, 13, 21]
groovy> list.collect { it*2 }
Result: [2, 4, 10, 26, 42]
- 지정된 횟수 만큼 반복 처리
groovy> 3.times { println( 'foobar' ) }
foobar
foobar
foobar
재귀호출(recursive call)로 계산하는 팩토리얼
편집def recfact(v, k) {
if (k <= 1) return v
else recfact(v*k, k - 1)
}
def factorial(n) {
return recfact(1, n)
}
for (m in 0..<10)
println "$m! = ${factorial(m)}"
실행 결과:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
같이 보기
편집각주
편집- ↑ 가 나 “Releases - apache/groovy”. 2022년 9월 27일에 확인함 – GitHub 경유.
외부 링크
편집- 그루비 공식 홈페이지
- (영어) 아파치 그루비 - Curlie