Groovy

알비레오·2025년 4월 9일

컴퓨터 여러가지

목록 보기
17/21

Groovy

Java Virtual Machine(JVM) 위에서 동작하는 동적 객체 지향 언어

  • java와 99% 호환
  • 스크립트 언어로도, 정적 타입 언어로도 사용 가능
  • Apache Groovy로 오픈소스로 유지 관리 중

특징

  1. 간결한 문법 : 세미콜론, 괄호, 타입 선언 생략 가능
  2. 스크립트 언어 : 빠른 실행, REPL 지원
  3. 정적 동적 타이핑 : def로 동적 타입, 명시적으로 정적 타입도 가능
  4. 강력한 컬렉션 API : 리스트, 맵 처리 간단
  5. 클로저(Closure) 지원 : 일급 함수 기반의 함수형 프로그래밍 가능
  6. 빌드/배치 친화적 : Gradle, Jenkins 등에서 핵심적으로 사용됨

Groovy 문법

변수 선언

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 p

Elvis 연산자

def name = userName ?: "Guest"
  • userName: 이 변수의 값이 null이거나 빈 값이면, "Guest"가 name 변수에 할당됨
  • ?:(Elvis 연산자)
    1. 왼쪽 피연산자(userName)가 null 또는 false로 평가되면 오른쪽 피연산자("Guest")를 반환함
    2. 왼쪽 피연산자가 유효한 값(즉, null이 아니고 false로 평가되지 않는 값)을 가지면, 그 값을 반환함

Java VS Groovy

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()

0개의 댓글