Java Virtual Machine(JVM) 위에서 동작하는 동적 객체 지향 언어
- java와 99% 호환
- 스크립트 언어로도, 정적 타입 언어로도 사용 가능
- Apache Groovy로 오픈소스로 유지 관리 중
특징
- 간결한 문법 : 세미콜론, 괄호, 타입 선언 생략 가능
- 스크립트 언어 : 빠른 실행, REPL 지원
- 정적 동적 타이핑 : def로 동적 타입, 명시적으로 정적 타입도 가능
- 강력한 컬렉션 API : 리스트, 맵 처리 간단
- 클로저(Closure) 지원 : 일급 함수 기반의 함수형 프로그래밍 가능
- 빌드/배치 친화적 : Gradle, Jenkins 등에서 핵심적으로 사용됨
변수 선언
def name = "Groovy" // 동적 타입 String lang = "Groovy" // 정적 타입도 가능리스트 & 맵
def list = [1, 2, 3] def map = [name: "Groovy", version: "4.0"] println list[0] // 1 println map["name"] // Groovy반복문, 클로저
list.each { println it } // 1, 2, 3 map.each { k, v -> println "$k: $v" }메서드 정의
def greet(name) { return "Hello, $name" }클래스 정의
class Person { String name int age String toString() { return "$name is $age years old" } } def p = new Person(name: "Kim", age: 30) println pElvis 연산자
def name = userName ?: "Guest"
- userName: 이 변수의 값이 null이거나 빈 값이면, "Guest"가 name 변수에 할당됨
- ?:(Elvis 연산자)
1. 왼쪽 피연산자(userName)가 null 또는 false로 평가되면 오른쪽 피연산자("Guest")를 반환함
2. 왼쪽 피연산자가 유효한 값(즉, null이 아니고 false로 평가되지 않는 값)을 가지면, 그 값을 반환함
1. 변수 선언
int x = 10; String name = "Alice";def x = 10 또는 int x = 10 def name = "Alice 또는 String name = "Alice"2. 입출력
import java.util.Scanner; System.out.println("이름을 입력하세요:"); Scanner sc = new Scanner(System.in); String name = sc.nextLine(); System.out.println("안녕하세요, " + name + "님!") sc.close();print "이름을 입력하세요: " def name = System.in.newReader().readLine() println "안녕하세요, $name님!"3. 리스트, 맵, 배열
List<String> list = new ArrayList<>(); Map<String, Integer> map = new HashMap<>(); int[] arr = new int[3]; int[] arr1 = {10, 20, 30}; arr3 = new int[3];def list = ['a', 'b', 'c'] def map = [a:1, b:2] def arr = new int[3] def arr = [10, 20, 30] as int[]4. 조건문, switch문
- if, else if, else는 java와 Groovy 동일
// 첫 번째 if-else 블록 int x = 42; if (x > 10) { System.out.println("Big"); } else { System.out.println("Small"); } // 두 번째 switch 블록 String value = "hello"; switch (value) { case "hello": System.out.println("Greeting"); break; default: // 정규식 매칭은 switch에서 직접 지원되지 않으므로 if-else를 사용해야 함 if (value.matches("^h.*")) { // 정규식 매칭 System.out.println("Starts with h"); } else { System.out.println("Other"); } break; }def x = 42 if (x > 10) { println "Big" } else { println "Small" } def value = 'hello' switch(value) { case 'hello': println "Greeting" break case ~/^h.*/: // 정규식 매치 println "Starts with h" break default: println "Other" }5. 반복문 + 클로저
- java : for, while, do-while, for-each 존재
- Groovy : 범위 기반 for, each, times, collect 등 함수형 스타일 가능
import java.util.function.Consumer; // for 루프 for (int i = 1; i <= 3; i++) { System.out.println(i); } // while 루프 int x = 0; while (x < 3) { System.out.println(x); x++; } // foreach 스타일 List<Integer> numbers = Arrays.asList(1, 2, 3); for (int number : numbers) { System.out.println(number); } // 클로저 예시 -> 자바에서 람다 표현식 사용 Consumer<String> greet = name -> System.out.println("Hi, " + name + "!"); greet.accept("Groovy");// for 루프 for (i in 1..3) { println i } // while 루프 def x = 0 while (x < 3) { println x++ } // each (foreach 스타일) [1, 2, 3].each { println it } // 클로저 예시 def greet = { name -> println "Hi, $name!" } greet("Groovy")6. 클래스 정의, 기본 생성자, 필드 초기화, 메서드 호출
public class Person { private String name; private int age; // 기본 생성자 public Person() {} // 생성자 오버로딩 public Person(String name, int age) { this.name = name; this.age = age; } // Getter & Setter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 메서드 public void sayHello() { System.out.println("Hi, I'm " + name + " and I'm " + age + " years old."); } // main public static void main(String[] args) { Person p = new Person("Alice", 30); p.sayHello(); } }class Person { String name int age def sayHello() { println "Hi, I'm $name and I'm $age years old." } } def p = new Person(name: "Alice", age: 30) p.sayHello()