Gradle & Groovy - Groovy 문법 2탄

gimseonjin616·5일 전
0

gradle

목록 보기
3/5

안녕하세요! 백엔드 개발자 Kerry 입니다.

이번에는 본격적인 Groovy 문법에 대해 정리해보려고 합니다!

개인적으로 학습한 내용을 정리하는 글이며 틀린 점이 있다면 가감없이 알려주세요!! 언제나 환영입니다!!

Type

우선 Groovy의 타입에 대해 정리해보려고 합니다.

Groovy는 Dynamic Typing language로 타입을 명시하지 않아도 알아서 추론해주는데요, JVM 기반 언어기 때문에 필요한 경우에는 Type을 명시해줄 수 있습니다.

Primitive Data Types

Groovy는 자바와 마찬가지로 원시 타입을 가지고 있으며, 필요한 경우에는 연관된 Wrapper 클래스도 쓸 수 있습니다!!

이름비트 수자료형Wrapper Class
byte8 bit정수형Byte
short16 bit정수형Short
int32 bit정수형Integer
long64 bit정수형Long
float32 bit부동 소수점Float
double64 bit부동 소수점Double
boolean-불린형Boolean

Reference Data Types

Groovy에서도 참조 타입이 있습니다. 크게 5개 정도로 볼 수 있습니다.

String : 수정 불가능한 char 타입 모음이로 " 나 ', 또는 """로 감싸서 사용할 수 있습니다. java.lang.String class를 사용합니다.
BigInteger & BigDecimal : groovy 원시타입도 숫자 표현을 최대 64 bit까지 사용가능하기 때문에 그보다 더 큰 수를 쓰기 위한 참조 타입입니다.
List: 순서가 유지되는 요소들의 컬렉션으로, 중복을 허용하고 인덱스로 접근할 수 있습니다.
Map: 키와 값의 쌍으로 이루어진 컬렉션으로, 각 키를 통해 값을 빠르게 조회할 수 있습니다.
Range: 시작 값과 끝 값을 포함하는 연속된 시퀀스를 나타내는 객체입니다.

Special type

이 외에도 두 가지 정도 특별한 타입이 있는데 Closure와 Null이다 Null은 많은 프로그래밍 언어에서도 사용되는데 Closure는 FP에서 사용되는 개념이라 나중에 추가로 정리해보려고 한다.

Closure: 실행 가능한 코드 블록을 객체로 취급하며, 변수 캡처 및 전달이 가능한 함수형 프로그래밍 구성 요소입니다.
Null: 어떠한 객체도 참조하지 않음을 나타내는 특별한 타입으로, null 값을 표현합니다.

Method

Groovy에서는 def 키워드를 사용하여 메소드를 선언할 수 있습니다.
def를 사용하면 반환 타입을 명시하지 않고도 메소드를 정의할 수 있으며, Groovy가 동적 타이핑(dynamic typing)에 따라 타입을 유추합니다.

def add(a, b) {
    return a + b
}

def sub(a, b) {
    return a - b
}

def mul(a, b) {
    return a * b
}

def div(a, b) {
    return a / b
}

만약 반환 타입을 명시하고 싶다면 def 대신 실제 타입(예: int)을 사용할 수 있습니다.
예제 코드에서처럼 int add(a, b) 등으로 선언하면, 반환 타입이 정적으로 지정됩니다.

int add(a, b) {
    return a + b
}

int sub(a, b) {
    return a - b
}

int mul(a, b) {
    return a * b
}

int div(a, b) {
    return a / b
}

Class

다음은 클래스입니다.
Groovy의 클래스는 Java의 클래스와 거의 유사하지만, 몇 가지 차이점이 있습니다.

첫째, Groovy에서는 접근 제어자를 생략해도 기본적으로 메소드가 public으로 처리되고, 클래스 레벨의 필드를 def로 선언하면 자동으로 프로퍼티(getter/setter가 생성됨)로 취급되어, Java처럼 매번 private나 public을 명시할 필요가 없습니다.

둘째, def 키워드를 사용해 동적 타이핑을 지원하므로, 변수나 메소드 선언 시 타입을 명시하지 않고도 간결하게 코드를 작성할 수 있습니다.

class Calculator {
    int a,
    int b

    Calculator(int a, int b) {
        this.a = a
        this.b = b
    }

    def add() {
        return a + b
    }

    def sub() {
        return a - b
    }

    def mul() {
        return a * b
    }

    def div() {
        return a / b
    }
}

def calc = new Calculator(10, 5)
calc.add()

조건문

조건문은 Java와 거의 똑같습니다.

if(condition){
	// do something
    
} else if (condition) {
	// do something
    
} else {
	// do something

}

다만 고려해야할 건 Truth 조건들인데 이 부분이 Java와 차이가 납니다.

예를 들어 Java에서는 condition에는 Boolean Type이나 Boolean 표현식이 들어가야하는데 Groovy는 각 타입별로 Truth 조건을 넣어서 만들 수 있습니다.

def list = [1, 2, 3, 4, 5]
if (list) {
    print("list is not empty")
}

각 타입별 Truth 조건은 아래와 같습니다.

Numbers: 숫자가 0(또는 0.0 등)인 경우 false, 그 외의 숫자는 true로 평가됩니다.
Strings: 문자열이 비어있거나(null 또는 빈 문자열 "")인 경우 false, 내용이 있는 문자열은 true로 평가됩니다.
Collections: 리스트, 배열, 맵 등 컬렉션이 비어 있으면 false, 하나 이상의 요소가 있으면 true로 평가됩니다.
Objects: 객체는 null이면 false, null이 아니면 기본적으로 true로 평가됩니다.

그 외에도 Java에서 쓰는 조건 연산자와 switch문도 사용 가능합니다.

// 조건 연산자
age = 17
title = (age < 19) ? "청소년" : "성인"

// switch문
switch (calc.add()) { 
    case 15:
        print("15")
        break
    case 20:
        print("20")
        break
    default:
        print("default")
        break
}

반복문

Groovy에서는 Java와 유사한 while 및 for 루프를 사용할 수 있을 뿐 아니라, 클로저를 활용한 다양한 반복 방식도 제공합니다.

while 루프를 사용하면 조건에 따라 코드를 반복 실행할 수 있으며, 아래와 같이 작성할 수 있습니다.

while (condition) {
    // do something
}

또한, for 루프와 Groovy 특유의 간결한 컬렉션 순회 구문을 사용할 수 있습니다.

for (int i = 0; i < 5; i++) {
    // do something
}

for (i in 0..9) {
    // do something
}

for (i in [100, 90, 95, 80]) {
    // do something
}

for (i in list) {
    // do something
}

for (entry in map) {
    // do something
}

for (c in String) {
    // do something
}

또한, 컬렉션 타입에서는 클로저 기반의 반복 메소드를 활용할 수 있습니다.

list.each({ element ->
    // do something with element
})

map.each({ key, value ->
    // do something with key and value
})

list.eachWithIndex({ element, index ->
    // do something with element and index
})

map.eachWithIndex({ entry, index ->
    // do something with entry and index
})

이처럼 Groovy의 반복문은 다양한 구문과 클로저를 통해 간결하고 직관적으로 순회 작업을 수행할 수 있도록 지원합니다.


마무리

오늘은 간단하게 groovy 문법을 정리해봤습니다. 전체적으로 java와 유사하지만 각 타입별 Truth 조건이나, 클로저 기반의 문법, 동적 타이핑 특징 덕분에 간결하고 직관적인 사용이 가능한 점이 매우 재밌었습니다.

다음 시간에는 이제 이 groovy로 gradle 세팅을 어떻게 하는지, 내부에는 어떤 구조로 script를 작성하는지 분석해보고자 합니다.

읽어주셔서 감사합니다.

profile
to be data engineer

0개의 댓글

관련 채용 정보