Groovy 마스터하기: Java 플랫폼에서 스크립팅 입문 가이드
Groovy란?
Apache Groovy는 JVM에서 실행되는 객체지향, Java-문법-호환 언어입니다. Java 바이트코드로 컴파일되므로 Java Runtime Environment가 있는 모든 시스템에서 실행 가능합니다. Groovy는 동적 타이핑, 클로저, DSL 지원, 간결한 문법을 추가하여 Java의 대체재가 아닌 이상적인 동반자가 됩니다.
왜 Groovy를 사용하는가?
- 빠른 프로토타이핑이 가능한 동적, 민첩한 언어
- 기존 Java 라이브러리와 원활한 통합
- Java 개발자에게 자연스러움 – 학습 곡선 최소
- Java보다 더 간결하고 표현력 있는 코드
- Java와 자유롭게 혼용 가능 – 원하는 만큼만 사용
Groovy 역사
- 2003 – Bob McWhirter & James Strachan 개발
- 2004 – JSR 241로 초안 작성 (포기됨)
- 2005 – Jeremy Rayner & Guillaume Laforge에 의해 부활
- 2007 – 1.0 릴리스
- 2012 – 2.0 릴리스
- 2014 – 2.3 (Java 8 지원)
- 2015 – Apache Software Foundation 프로젝트 됨
Groovy 핵심 기능
- 리스트, 맵, 범위, 정규식을 위한 리터럴 문법
- 멀티메서드와 메타프로그래밍 기능
- 동적 및 선택적 정적 타이핑
- 연산자 오버로딩과 간결한 문법 (세미콜론, 괄호 불필요한 경우 많음)
- 클로저와 MetaObject Protocol로 강력한 스크립팅
- Java 바이트코드 및 라이브러리와 완전 호환
Groovy 설치 방법
- Java 설치 확인 – Java 설치 가이드
- Groovy 다운로드 페이지에서 설치 프로그램 다운로드
- 설치 프로그램 실행, 언어 선택, OK 클릭
- 환영 화면에서 NEXT 클릭

- 라이선스 동의

- 설치할 구성요소 선택 후 NEXT

- 설치 디렉토리 선택 후 NEXT

- 시작 메뉴 폴더 설정 후 NEXT

- 설치 완료 (경로 기본값 유지) 후 NEXT

- 시작 메뉴에서 Groovy Console 실행하여 확인

Groovy Hello World
Java 버전:
public class Demo {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Groovy 버전 – 단 한 줄:
println "Hello World."
Groovy는 세미콜론, 괄호, 장황한 System.out.println이 필요 없습니다.
변수
Java는 명시적 타입 필요:
public class Demo {
public static void main(String[] args) {
int x = 104;
System.out.println(x);
// x = "Guru99"; // 컴파일 타임 에러
}
}
Groovy는 def로 동적 타이핑 지원:
def x = 104
println x.getClass()
x = "Guru99"
println x.getClass()
출력:
class java.lang.Integer
class java.lang.String
여러 줄 문자열은 삼중 따옴표 사용:
def x = """Groovy at Guru99"""
println x
연산자
Groovy는 일반적인 범주 지원:
- 산술:
+ - * / %
- 관계:
== != < <= > >=
- 논리:
&& || !
- 비트:
& | ^ ~
- 대입:
= += -= *= /= %=
루프
Java for-루프:
for (int i = 0; i <= 5; i++) {
System.out.println(i);
}
Groovy 동등 표현:
0.upto(4) { println "$it" }
2.upto(4) { println "$it" }
5.times { println "$it" }
0.step(7, 2) { println "$it" }
조건문
| 문장 | 설명 |
| if | 조건이 참일 때 실행 |
| if/else | true 분기 실행, 아니면 else 분기 |
| nested if | 다중 조건 분기 |
| switch | 다중 분기 로직의 깔끔한 대안 |
| nested switch | Groovy에서 지원 |
리스트
리스트는 순서 있는 참조 컬렉션으로 대괄호로 정의:
- 문자열 리스트:
['Angular', 'Nodejs']
- 혼합 리스트:
['Groovy', 2, 4.6]
- 정수 리스트:
[16, 17, 18, 19]
- 빈 리스트:
[]
자주 쓰는 리스트 메서드:
| 메서드 | 설명 |
| add() | 끝에 값 추가 |
| contains() | 값 존재 시 true |
| get() | 인덱스 위치 요소 |
| isEmpty() | 요소 없으면 true |
| minus() | 지정 요소 제외한 새 리스트 반환 |
| plus() | 요소 추가한 새 리스트 반환 |
| pop() | 마지막 요소 제거 |
| remove() | 인덱스 위치 요소 제거 |
| reverse() | 뒤집힌 리스트 반환 |
| size() | 요소 개수 |
| sort() | 정렬된 복사본 반환 |
예제:
def y = ["Guru99", "is", "Best", "for", "Groovy"]
println y
y.add("Learning")
println(y.contains("is"))
println(y.get(2))
println(y.pop())
출력:
[Guru99, is, Best, for, Groovy]
true
Best
Learning
맵
맵은 키-값 쌍 컬렉션입니다.
- 예:
[Tutorial:'Java', Tutorial:'Groovy'] – 키 Tutorial에 두 값
- 빈 맵:
[]
맵 메서드:
| 메서드 | 설명 |
| containsKey() | 키 존재 확인 |
| get() | 키에 대한 값 반환 |
| keySet() | 키 집합 |
| put() | 키/값 쌍 추가 또는 교체 |
| size() | 엔트리 수 |
| values() | 값 컬렉션 |
예제:
def y = [fName:'Jen', lName:'Cruise', sex:'F']
print y.get("fName")
출력:
Jen
클로저
클로저는 객체로 취급되는 코드 블록으로, 람다와 유사합니다.
간단한 클로저:
def myClosure = { println "My First Closure" }
myClosure()
매개변수 있는 클로저:
def sum = { a, b, c -> return a + b + c }
println sum(1, 2, 3)
출력:
6
Groovy vs Java
| Groovy | Java |
| 기본 접근 제어자는 public | 기본은 package-private |
| 필드에 자동 getter/setter | 수동 정의 필요 |
| 큰따옴표로 문자열 인터폴레이션 | 인터폴레이션 없음 |
| 타이핑 선택적 | 타이핑 필수 |
| 세미콜론 불필요 | 세미콜론 필수 |
모든 스크립트가 자동으로 Script 클래스 확장 | 실행을 위해 public static void main 필요 |
흔한 오해
| 오해 | 현실 |
| Groovy는 스크립팅 전용 | 다재다능: 웹 프레임워크, 데이터 처리 등 다양 |
| Groovy는 순수 함수형 | 함수형 개념 차용하지만 OOP 언어 |
| Groovy는 TDD에만 이상적 | TDD 지원하지만 여러 시나리오에서 유용 |
| Groovy는 Grails에 한정 | Grails는 인기 프레임워크지만 Groovy는 독립적 |
Groovy 단점
- JVM 시작이 느려 퀵 스크립트에 영향
- Java 생태계 밖에서 범용적 채택 부족
- IDE 없이 덜 편리
- 런타임 성능이 Java보다 뒤질 수 있음
- 메모리 풋프린트 더 큼
- 효과적 사용 위해 Java 지식 필수
필수 Groovy 도구
- groovysh – 대화형 명령줄 셸
- groovyConsole – 스크립트 실행을 위한 Swing GUI
- groovy – 스크립트 실행을 위한 명령줄 인터프리터
사용 예:
groovysh
groovyConsole
- Groovy 코드 작성/실행을 위한 최소 에디터
groovy
요약
- Groovy는 Java 플랫폼용 객체지향 언어
- Java 라이브러리와 원활한 통합 제공
- 핵심 기능: 동적 타이핑, 클로저, 리터럴 문법
- 표준 연산자, 제어 흐름, 컬렉션, 맵 지원
- getter/setter 자동화 및 상용구 제거
- 성능 트레이드오프 존재하지만 생산성 이득 상당
- groovysh, groovyConsole, groovy 인터프리터 같은 도구가 개발 간소화