{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
|이름 = 그루비(Groovy)
|로고 = Groovy-logo.svg
|패러다임 = [[다중 패러다임 프로그래밍 언어|다중 패러다임]]
|연도 = 2003년
|설계자 = [[제임스 스트라칸]]
|개발자 = [[글라우미 라포어]]
  | latest release version = 4.0.5
  | latest release date = {{시작 날짜와 나이|2022|09|06}}<ref name="github-releases">{{웹 인용|url=https://github.com/apache/groovy/releases/tag/GROOVY_4_0_5|title=Releases - apache/groovy|via=[[GitHub]]|access-date=2022-09-27}}</ref>
| latest preview version = 4.0.0-beta-1
| latest preview date = {{시작 날짜와 나이|2021|09|06}}<ref name="github-releases" />
|형 체계 = 불규칙, 동적 타이핑
|구현체 = Groovy
|방언 = 
|영향을 받은 언어 = [[자바 (프로그래밍 언어)|자바]], [[루비]], [[파이썬]], [[스몰톡]]
|영향을 준 언어 =[[제이루비 (프로그래밍 언어)|제이루비]]
|운영 체제 = [[자바 가상 머신]]
|라이선스 = [[아파치 허가서]] 2.0
|웹사이트 = http://www.groovy-lang.org/
}}

'''그루비'''(Groovy)는 [[자바 (프로그래밍 언어)|자바]]에 [[파이썬]], [[루비 (프로그래밍 언어)|루비]], [[스몰토크]] 등의 특징을 더한 [[동적 프로그래밍 언어|동적]] [[객체 지향 프로그래밍 언어|객체 지향]] [[프로그래밍 언어]]이다.

== 특징 ==
* [[자바 가상 머신]]에서 작동하는 동적 타이핑 프로그래밍 언어이다.
* [[자바 (프로그래밍 언어)|자바]]의 강점 위에 [[파이썬]], [[루비 (프로그래밍 언어)|루비]], [[스몰토크]] 등의 프로그래밍 언어에 영향을 받은 특장점을 더하였다.
* [[자바 (프로그래밍 언어)|자바]] 프로그래머들이 많은 학습을 하지 않고도 최신 프로그래밍 기법을 사용할 수 있다.
* 도메인 전문 언어와 단순화된 문법을 지원하여 코드를 읽고 유지 보수하기 편해진다.

== 역사 ==
2002년 [[영국]] 출신의 프로그래머인 [[제임스 스트라칸]]에 의해 창시되었으며 현재 [http://www.apache.org/licenses/LICENSE-2.0 아파치 사용 허가서 2.0] 아래에 소스와 바이너리가 배포, 공개되어 있다.
2012년 6월 2일 2.0버전이 출시되었다.

== 철학 ==
그루비의 창시자 [[제임스 스트라칸]]은 그루비의 가장 중요한 점이 타입이 유연 간결한 동적인 프로그래밍 언어라고 한다.

== 자바와의 비교 ==
그루비의 문법 체계는 자바의 것을 계승 발전시켰다. 자바에는 없는 간편 표기법(syntactic sugar)을 지원하는 외에 리스트, 맵, 정규식을 위한 구문을 제공함으로써 프로그래밍을 쉽고 간결하게 해 준다. 더구나 [[LISP]] 언어 초기부터 있어 왔던 [[클로저 (컴퓨터 프로그래밍)|클로저]]를 도입함으로써 [[메타프로그래밍]]이 가능하게 하였다. 자바가상기계(JVM) 상에서 동작하는 동적인 스크립팅 언어 [[Jython]], [[JRuby]], [[Jacl]], [[Rhino]], [[LuaJava]] 등에 비해 손색이 없으며, 짧은 역사에도 불구하고 빠른 발전을 하고 있다.

자바 소스는 컴파일해야만 사용할 수 있지만, 그루비 소스는 스크립트 파일 그대로 실행시킬 수도 있고, 자바처럼 컴파일하여 쓸 수도 있다. 거의 대부분의 자바 소스는 파일 확장자만 바꾸면 수정 없이 그루비에서도 쓸 수 있다.

다음은 표준 Java 5+의 예제이다.

<syntaxhighlight lang="java">
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);
  }
}
</syntaxhighlight>

그루비를 사용하면 아래처럼 간단하게 표현할 수 있다.

<syntaxhighlight lang="groovy">
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
</syntaxhighlight>

== 도구 ==
=== groovy ===
* 가장 많이 쓰는 그루비 스크립트 실행 도구
** 실행 예: groovy hello.groovy

=== groovyc ===
* 자바 쪽에서 불러 쓸 수 있는 라이브러리 만들 때 쓰는 그루비 컴파일러
* 내용은 자바 소스와 거의 같으나 파일 확장명을 groovy로 하여 저장한다.
(소스 파일명: HelloWorld.groovy)
<syntaxhighlight lang="groovy">
public class HelloWorld {
    public static void main(String[] args) {
        println "Hello, World!"
    }
}
</syntaxhighlight>

<ul>
<li>미리 환경변수 CLASSPATH를 설정한다. (java로 실행할 때 필요함)
<ul>
<li>윈도
<syntaxhighlight lang="dos">
>set CLASSPATH=%GROOVY_HOME%\embeddable\groovy-all-1.7.3.jar
</syntaxhighlight></li>
<li>유닉스/리눅스
<syntaxhighlight lang="bash">
$ export CLASSPATH=$GROOVY_HOME/embeddable/groovy-all-1.7.3.jar
</syntaxhighlight>
</ul>
</li>
</ul>
* 컴파일
<syntaxhighlight lang="dos">
>groovyc -d . HelloWorld.groovy
</syntaxhighlight>
* 실행
<syntaxhighlight lang="dos">
>java -classpath .;%CLASSPATH% HelloWorld
</syntaxhighlight>

=== groovysh ===
* 간단한 코드를 테스트하는데 좋은 그루비 쉘
<syntaxhighlight lang="groovy" highlight="1">
>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
</syntaxhighlight>

== 예제 ==
=== 기본적인 코드 ===
* 그루비에서는 거의 모든 것이 객체이다.
** 문자열 객체
<syntaxhighlight lang="groovy">
groovy:000> "Groovy is groovy".length()
===> 16
groovy:000> "Rick".indexOf("k")
===> 3
</syntaxhighlight>
* 클래스의 정적 메소드(static method) 호출
<syntaxhighlight lang="groovy">
groovy:000> Math
===> class java.lang.Math
groovy:000> Math.abs(-75)
===> 75
</syntaxhighlight>

=== 컬렉션(collection) ===
==== 리스트(list) ====
<syntaxhighlight lang="groovy">
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]
</syntaxhighlight>
==== 맵(map) ====
<syntaxhighlight lang="groovy">
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"]
</syntaxhighlight>

=== 제어구조 ===
<syntaxhighlight lang="groovy">
groovy> if ("fablic".length() > 3)
groovy> println 'ya'
groovy> else
groovy> println 'nop'

ya
</syntaxhighlight>
<syntaxhighlight lang="groovy">
groovy> def n = 0
groovy> while (n < 3){
groovy> println n++
groovy> }

0
1
2
</syntaxhighlight>

* 일부 제어구조는 반복자(iterator)로 대신할 수 있다.

=== 클로저(closure)와 반복자(iterator) ===
==== 반복 처리 ====
* 리스트의 각 요소로 반복 처리
:* 클로저를 사용하지 않는 경우
<syntaxhighlight lang="groovy">
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]
</syntaxhighlight>
:* 클로저를 사용한 경우
<syntaxhighlight lang="groovy">
groovy> def list = [1, 2, 5, 13, 21]
groovy> list.collect { it*2 }

Result: [2, 4, 10, 26, 42]
</syntaxhighlight>

* 지정된 횟수 만큼 반복 처리
<syntaxhighlight lang="groovy">
groovy> 3.times { println( 'foobar' ) }
foobar
foobar
foobar
</syntaxhighlight>

=== 재귀호출(recursive call)로 계산하는 팩토리얼 ===
<syntaxhighlight lang="groovy">
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)}"
</syntaxhighlight>
실행 결과:
<syntaxhighlight lang="text">
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
</syntaxhighlight>

== 같이 보기 ==
* [[그레일즈]](Grails): [[루비 온 레일즈]]와 비슷한 웹 개발 프레임워크
* [[프로그래밍 언어]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* [https://web.archive.org/web/20140302111159/http://groovy.codehaus.org/ 그루비 공식 홈페이지]
* {{Dmoz|Computers/Programming/Languages/Java/Extensions/Groovy}}

{{아파치}}
{{프로그래밍 언어}}
{{자바 (소프트웨어 플랫폼)}}

{{전거 통제}}

[[분류:2003년 도입]]
[[분류:코드 예시에 관한 문서]]
[[분류:JVM 프로그래밍 언어]]
[[분류:객체 지향 프로그래밍 언어]]
[[분류:2003년 개발된 프로그래밍 언어]]
[[분류:스크립트 언어]]
[[분류:자바 프로그래밍 언어 계열]]
[[분류:아파치 라이선스 소프트웨어]]
[[분류:크로스 플랫폼 자유 소프트웨어]]
[[분류:동적 프로그래밍 언어]]
[[분류:동적 타입 프로그래밍 언어]]
[[분류:고급 프로그래밍 언어]]
[[분류:자바 사양 요청]]