아파치 그루비

Apache Groovy
그루비
Groovy-logo.svg
그루비 로고
패러다임멀티패러다임: 객체 지향, 명령어, 기능, 애스펙트 지향, 스크립트
설계자제임스 스트래찬
개발자기욤 라포르주(PMC 체어)
요헨 테오도로우(테크 리더)
폴 킹
세드릭 샹보
처음 등장한2003년; 19년 전(2003년)
안정된 릴리스4.0.2 (2022년 4월 19일, 3개월 전 (2022-04-19)[1] [±]
프리뷰 릴리즈
4.0.0-beta-1 / 2021년 9월 6일; 11개월 전(2021-09-06)[1]
타이핑 분야다이내믹, 스태틱, 스트롱, 오리
플랫폼자바 SE
면허증.Apache 라이센스 2.0
파일 이름 확장자.groovy, .gvy, .gy, .gsh[2]
웹 사이트groovy-lang.org Edit this at Wikidata
주요 구현
그래들, 그래일스
영향을 받다
Java, Python, Ruby, Smalltalk
영향받은
코틀린

Apache GroovyJava 플랫폼용 Java 구문 호환 객체 지향 프로그래밍 언어입니다.Python, Ruby, Smalltalk와 유사한 기능을 가진 정적 및 동적 언어입니다.Java Platform용 프로그래밍 언어스크립트 언어로 사용할 수 있으며 Java Virtual Machine(JVM; Java 가상 머신) 바이트 코드로 컴파일되어 다른 Java 코드 및 라이브러리와 심리스하게 상호 운용됩니다.Groovy는 Java 구문과 유사한 곱슬브래킷 구문을 사용합니다.Groovy는 닫힘, 여러 줄의 문자열 및 문자열에 포함된 식을 지원합니다.Groovy의 파워의 대부분은 주석을 통해 트리거되는 AST 변환에 있습니다.

Groovy 1.0은 2007년 1월 2일에, Groovy 2.0은 2012년 7월에 출시되었습니다.버전 2 이후 Groovy는 정적으로 컴파일할 수 있으며,[3][4] Java와 유사한 유형 추론 및 성능을 제공합니다.Groovy 2.4는 [5]Pivotal Software의 후원으로 2015년 3월에 종료된 마지막 메이저 릴리스입니다.그 후 Groovy는 Apache Software [6]Foundation의 Project Management Committee로 거버넌스 구조를 변경했습니다.

역사

James Strachan은 2003년 [7]8월 블로그에서 그루비의 개발에 대해 처음 언급했다.2004년 3월 그루비는 JCP에 JSR 241로[8] 제출되어 투표로 승인되었다.2004년과 2006년 사이에 몇 가지 버전이 출시되었습니다.Java Community Process(JCP; Java 커뮤니티 프로세스) 표준화 작업이 시작된 후 버전 번호가 변경되어 "1.0"이라는 이름의 버전이 2007년 1월 2일에 출시되었습니다.다양한 베타 및 출시 후보들이 1.1을 기록한 후, 2007년 12월 7일 그루비 1.1 파이널이 출시되었고, 즉시 그루비 1.5로 번호가 변경되었다.

2007년 Groovy는 JAX 2007 이노베이션 [9]어워드에서 1위를 차지했습니다.2008년에는 Groovy Web 프레임워크인 Grails가 JAX 2008 이노베이션 [10]어워드에서 2위를 차지했습니다.

2008년 11월에 Spring Source는 Groovy and Grails 회사(G2One)[11]를 인수했습니다.2009년 8월에 VMware는 Spring [12]Source를 인수했습니다.

2012년 4월 Spec Lead는 8년간의 활동 중단 후 JSR 241의 상태를 휴면 [8]상태로 변경했습니다.

Strachan은 2007년 [citation needed]그루비 1.0이 출시되기 1년 전에 이 프로젝트를 묵묵히 떠났다.2016년 10월 Strachan은 "나는 여전히 그루비(젠킨스 파이프라인이 너무 그루비해!)", 자바, 고, 타이프스크립트, 코틀린을 사랑한다"[13]고 말했다.

2012년 7월 2일, Groovy 2.0이 출시되었으며, 여기에는 정적 컴파일과 정적 유형 검사가 추가되었다.

2013년 4월에 EMC Corporation(EMC)과 VMwarePivotal Software의 합작회사를 분사했을 때 Groovy와 Grails는 제품 포트폴리오의 일부를 구성했습니다.Pivotal은 2015년 [5]4월부터 Groovy와 Grails의 후원을 중단했습니다.같은 달 Groovy는 인큐베이터를 [6]통해 지배구조를 Codehouse 저장소에서 Apache Software Foundation의 Project Management Committee(PMC; 프로젝트 관리 위원회)로 변경했습니다.Groovy는 Apache의 인큐베이터를 졸업하고 2015년 [14]11월에 최상위 프로젝트가 되었습니다.

특징들

대부분의 유효한 Java 파일은 유효한 Groovy 파일이기도 합니다.두 언어는 비슷하지만, Java가 필요로 하는 [15]모든 요소가 필요하지 않기 때문에 그루비 코드는 더 콤팩트할 수 있습니다.이것은 자바 프로그래머들이 그루비 프로그래밍 숙어[16]더 습득하기 전에 익숙한 자바 구문에서 시작하여 그루비를 점차적으로 배울 수 있게 한다.

Java에서 사용할 수 없는 Groovy 기능에는 정적 타이핑과 동적 타이핑이 모두 포함됩니다(키워드 사용).def) 연산자 오버로드, 목록 및 관련 배열 네이티브 구문(표준), 정규 표현 네이티브 지원, 다형 반복, 문자열 보간, 추가 도우미 메서드 및 세이프 네비게이션 연산자 ?.null 포인터를 자동으로 체크합니다(예:variable?.method(), 또는variable?.field를 참조해 주세요.[17]

버전 2 Groovy는 모듈 방식도 지원하므로(프로젝트 요구에 따라 필요한 항아리만 출하할 수 있으므로 Groovy 라이브러리의 크기를 줄일 수 있음), 유형 확인, 정적 컴파일, 프로젝트 코인 구문 향상, 멀티태치 블록 및 지속적인 성능 향상 기능을 사용하여invokedynamicJava [18]7에서 도입된 명령입니다.

Groovy는 XML HTML과 같은 다양한 마크업 언어에 대한 네이티브 지원을 제공하며 인라인 문서 객체 모델(DOM) 구문을 통해 구현됩니다.이 기능을 통해 균일하고 간결한 구문 및 프로그래밍 [citation needed]방법론을 통해 다양한 유형의 이기종 데이터 자산을 정의하고 조작할 수 있습니다.

Java와 달리 Groovy 소스 코드 파일은 (컴파일되지 않은) 스크립트로 실행할 수 있습니다.클래스 정의 외부에 코드가 포함되어 있거나 메인 메서드를 사용하는 클래스이거나 Runnable 또는 GroovyTestCase인 경우입니다.Groovy 스크립트는 실행 전에 완전히 구문 분석, 컴파일 및 생성됩니다(Python 및 Ruby와 유사).이는 후드 아래에서 발생하며 컴파일된 버전은 프로세스의 [19]아티팩트로 저장되지 않습니다.

GroovyBeans, 속성

GroovyBeansJavaBeans의 Groovy 버전입니다.Groovy는 암묵적으로 게터와 세터를 생성합니다.다음 코드에서는setColor(String color)그리고.getColor()은 암묵적으로 생성됩니다.색상에 직접 액세스 하는 것처럼 보이는 마지막 두 줄은 실제로 암묵적으로 생성된 [20]메서드를 호출합니다.

학급 AGroovyBean {   스트링 색. }  방어하다 마이 그루비빈 = 신규 AGroovyBean()  마이 그루비빈.setColor(컬러 설정)('베이비 블루') 주장하다 마이 그루비빈.getColor(컬러)() == '베이비 블루'  마이 그루비빈.색. = '피터' 주장하다 마이 그루비빈.색. == '피터' 

Groovy는 Java의 배열 구문[21]연상시키는 단순하고 일관된 구문을 제공합니다.

방어하다 무비 리스트 = [데르수 우잘라, '란', 일곱 명의 사무라이]  // 배열처럼 보이지만 목록입니다. 주장하다 무비 리스트[2] == 일곱 명의 사무라이 무비 리스트[3] = '카사블랑카'  // 목록에 요소를 추가합니다. 주장하다 무비 리스트.크기() == 4  방어하다 month Map = [ '1월' : 31, '2월' : 28, '마치 : 31 ]  // 맵을 선언합니다. 주장하다 month Map['마치] == 31  // 엔트리에 액세스합니다. month Map[에이프릴] = 30  // 지도에 엔트리를 추가합니다. 주장하다 month Map.크기() == 4 

시제품 확장

Groovy는 다음을 통해 프로토타입 확장을 지원합니다.ExpandoMetaClass확장 모듈(Groovy 2에만 해당), Objective-C와 유사한 카테고리DelegatingMetaClass를 클릭합니다.[22]

ExpandoMetaClass는 도메인 고유의 언어(DSL)를 제공하여 Ruby의 오픈 클래스 개념과 마찬가지로 클래스 변경을 쉽게 표현합니다.

번호.메타클래스 {   sqrt = { 수학.sqrt(위임하다) } }  주장하다 9.sqrt() == 3 주장하다 4.sqrt() == 2 

Groovy의 각 속성/메서드 호출은 메타클래스 레지스트리를 통해 이루어지기 때문에 프로토타이핑을 통한 Groovy의 코드 변경은 Java에서 볼 수 없습니다.변경된 코드는 Java에서 메타클래스 레지스트리로 이동해야만 액세스할 수 있습니다.

Groovy는 또한 다음과 같은 오버라이드 메서드를 허용합니다.getProperty(),propertyMissing()특히, 개발자는 오브젝트에 대한 콜을 대행 수신하고 액션을 지정할 수 있습니다.다음 코드는 클래스를 활성화합니다.java.lang.String에 응답하다hex속성:

열거하다 색. {   블랙입니다.('#000000'), 하얀색('#FFFF'), 빨간.('#FF0000'), 파랑색('#0000FF')   스트링 16진수   색.(스트링 16진수) {      이것..16진수 = 16진수    } }  스트링.메타클래스.getProperty = { 스트링 소유물 ->   방어하다 스트링 컬러 = 위임하다   한다면 (소유물 == '실패') {     색..가치().발견하다 { 그것.이름.().equals Ignore Case 스트링 컬러 }?.16진수   } }  주장하다 "흰색".16진수 == "#FFFF" 주장하다 '파랑'.16진수 == "#0000FF" 주장하다 "검은색".16진수 == "#000000" 주장하다 "녹색".16진수 == 무효 

Grails 프레임워크는 메타프로그래밍을 광범위하게 사용하여 다음과 같은 GORM 동적 검색기를 활성화합니다.User.findByName('Josh')기타 [23]등등.

점과 괄호

Groovy의 구문은 일부 상황에서 괄호와 점을 생략할 수 있습니다.다음 그루비 코드

가지고 가다(커피.).와 함께(설탕, 우유).그리고.() 

라고 쓸 수 있다

가지고 가다 커피. 와 함께 설탕, 우유 그리고.  

일반 영어처럼 보이는 도메인 고유 언어(DSL)를 개발할 수 있습니다.

기능 프로그래밍

그루비는 대부분 객체 지향 언어이지만 기능적인 프로그래밍 기능도 제공합니다.

폐쇄

Groovy의 문서에 따르면: "Groovy의 클로저는 '메서드 포인터'와 유사하게 작동하여 나중에 코드를 작성하고 실행할 수 있습니다."[24]Groovy의 폐쇄는 자유 변수, 즉 명시적으로 매개 변수로 전달되지 않은 변수를 지원하지만 선언 컨텍스트, 부분 적용('카레링'[25]이라고 함), 위임, 암묵적, 유형화 및 유형화되지 않은 매개 변수에 존재한다.

결정된 유형의 컬렉션에서 작업할 때 컬렉션에서 작업에 전달된 닫힘을 유추할 수 있습니다.

목록. = [1, 2, 3, 4, 5, 6, 7, 8, 9]  /* * 0이 아닌 숫자는 true로 강제되므로 % 2 == 0(짝수)이면 false입니다. * 암묵적인 "it" 매개 변수의 유형은 IDE에서 Integer로 추론할 수 있습니다. * 다음과 같이 쓸 수도 있습니다. * 리스트.findAll { 정수 i -> i % 2 } * 리스트.find All { i - > i % 2 } */ 방어하다 승산 = 목록..모두 검색 { 그것 % 2 }  주장하다 승산 == [1, 3, 5, 7, 9] 

표현식 그룹은 구현을 참조하지 않고 폐쇄 블록에 쓸 수 있으며 위임을 사용하여 나중에 응답 개체를 할당할 수 있습니다.

// 이 코드 블록에 구현에 대한 참조가 없는 식이 포함되어 있습니다. 방어하다 조작 = {   선언하다 5    4   나누다 3   인쇄물 } 
/* * 이 클래스는 위의 클로징에서 사용할 수 있는 작업을 처리합니다.다른 클래스 * 같은 방법을 사용한다고 선언할 수 있지만, 예를 들어 웹 서비스 조작을 사용합니다. * 계산 시. */ 학급 표현 {   빅데시멀 가치    /* * Integer는 파라미터로 전달되지만 Big Decimal로 강제됩니다. * 정의되어 있습니다.클래스에 'declare(integer value)' 메서드가 있는 경우 대신 이 메서드가 사용됩니다. */   방어하다 선언하다(빅데시멀 가치) {     이것..가치 = 가치   }      방어하다 (빅데시멀 추가할 값) {     이것..가치 += 추가할 값   }      방어하다 나누다(빅데시멀 제수) {     이것..가치 /= 제수   }      방어하다 속성 누락(스트링 소유물) {     한다면 (소유물 == 인쇄) 인쇄 가치   } } 
// 위 코드 블록의 식에 응답할 사용자를 정의합니다. 조작.위임하다 = 신규 표현() 조작() 

카레시

일반적으로 부분 [25]애플리케이션이라고 하는 이 그루비 기능을 사용하면 모든 인수의 폐쇄 매개변수를 기본 매개변수로 설정하여 바운드 값을 사용하여 새 폐쇄를 만들 수 있습니다.1개의 인수를 에 제공하다curry()메서드는 인수 1을 수정합니다.N개의 인수를 지정하면 인수 1이 수정됩니다.n.

방어하다 TwoWords With Symbol에 참여 = { 기호., 첫번째, 둘째 -> 첫번째 + 기호. + 둘째 } 주장하다 TwoWords With Symbol에 참여('#', '안녕하세요', '세계') == 'Hello # World'  방어하다 concat Words(콘캣 워드) = TwoWords With Symbol에 참여.카레시(' ') 주장하다 concat Words(콘캣 워드)('안녕하세요', '세계') == 'Hello World'  방어하다 프리펜드 헬로 = concat Words(콘캣 워드).카레시('안녕하세요') //def prependHello = joinTwoWordsWithSymbol.curry(' ' , '안녕하세요') 주장하다 프리펜드 헬로('세계') == 'Hello World' 

카레는 역방향(마지막 N개 인수 수정)으로도 사용할 수 있습니다.rcurry().

방어하다  = { 빅데시멀 가치, 빅데시멀  ->   가치** }  방어하다 광장 = .rcury(2) 방어하다 입방체 = .rcury(3)  주장하다 (2, 2) == 4 주장하다 광장(4) == 16 주장하다 입방체(3) == 27 

또한 Groovy는 느린 평가,[26][27] 축소/접기,[28] 무한 구조[30]불변성 [29]등을 지원합니다.

JSON 및 XML 처리

JavaScript Object Notation(JSON) 및 XML 처리에서 Groovy는 Builder 패턴을 채택하여 데이터 구조를 보다 상세하게 만듭니다.예를 들어 다음과 같은 XML이 있습니다.

<timeout> <language year="timeout"> <name> </name> </timeout> 객체 지향 </timeout> </timeout> </timeout> </timeout> </language> <language year="time"> <name>Ruby<, /name>,<>paradigm>, 기능, 개체 oriented<, /paradigm>, <, typing>, 오리 타이핑 dynamic<, /typing>,<>/language>,<>언어 year="2003년">,<>name&gt을 말한다.Groovy<, /name>,<>paradigm>, 기능, 개체 oriented<, /paradigm>, <, typing>, 오리 타이핑, 동적, static<, /typing>,<>/language>,<>/languages&gt을 말한다.

다음 Groovy 코드를 통해 생성할 수 있습니다.

방어하다 작가. = 신규 StringWriter() 방어하다 빌더 = 신규 그루비.xml.마크업빌더(작가.) 빌더.언어들 {   언어(연도: 1995) {     이름. 자바     패러다임 "객체 지향"     타자 치기 '정적"   }   언어 (연도: 1995) {     이름. '루비     패러다임 "기능적, 객체 지향적"     타자 치기 "다이나믹 타이핑"   }   언어 (연도: 2003) {     이름. "그루비"     패러다임 "기능적, 객체 지향적"     타자 치기 "타이핑, 동적, 정적"   } } 

또한 스트리밍 방식으로 처리할 수 있습니다.StreamingMarkupBuilder구현을 JSON으로 변경하려면MarkupBuilder로 교환할 수 있다JsonBuilder를 클릭합니다.[31]

해석하고 기능하는 언어를 검색하려면 그루비의findAll메서드는 다음 기능을 수행합니다.

방어하다 언어들 = 신규 Xml슬러퍼().해석 텍스트 작가..문자열()  // 다음은 Groovy의 matcher(=~)에 대한 regex 구문을 채택한 것입니다. // boolean value: 값에 문자열이 포함되어 있으면 true, 포함되지 않으면 false 중 하나입니다. 방어하다 기능하다 = 언어들.언어.모두 검색 { 그것.패러다임 =~ 기능하고 있다 } 주장하다 기능하다.모으다 { 그것.이름. } == ["그루비", '루비] 

문자열 보간

Groovy에서는 GString을 [32]사용하여 변수와 식을 사용하여 문자열을 보간할 수 있습니다.

빅데시멀 계좌 = 10.0 방어하다 본문 = "계정은 현재 $account 잔액을 보여줍니다." 주장하다 본문 == "계정은 현재 10.0의 잔액을 나타내고 있습니다." 

변수와 식이 포함된 GString은 큰따옴표를 사용하여 선언해야 합니다.

복잡한 표현식은 대괄호로 묶어야 합니다.이로 인해, 그 일부가, 식에 속하지 않고, 주변 문자열에 속하는 것으로 해석되지 않게 됩니다.

빅데시멀 마이너스 = 4.0 본문 = "계정에는 현재 ${account - - - - }의 잔액이 표시되어 있습니다." 주장하다 본문 == "계정은 현재 6.0의 잔액을 나타내고 있습니다."  // 식을 분리하는 괄호가 없으면 다음과 같이 됩니다. 본문 = "계정은 현재 $account-----의 잔액을 나타내고 있습니다." 주장하다 본문 == "계정 잔액은 현재 10.0 - 마이너스입니다." 

식 평가는 화살표 구문을 사용하여 연기할 수 있습니다.

빅데시멀 세금 = 0.15 본문 = "계정은 현재 ${->계정*tax}의 잔액을 나타내고 있습니다." 세금 = 0.10  // GString 신고 후 tax 값이 변경되었습니다.표현 // 변수는 식을 실제로 평가해야 하는 경우에만 바인딩됩니다. 주장하다 본문 == "계정은 현재 9.000의 잔액을 나타내고 있습니다." 

추상 구문 트리 변환

Groovy의 자체 문서에 따르면, "Groovy 컴파일러가 Groovy 스크립트와 클래스를 컴파일할 때, 프로세스 중 어느 시점에 소스 코드는 구체적인 구문 트리의 형태로 메모리에 나타나 추상 구문 트리로 변환됩니다.AST Transformations의 목적은 개발자가 컴파일 프로세스에 접속하여 AST가 JVM에 의해 실행되는 바이트 코드로 변환되기 전에 수정할 수 있도록 하는 것입니다.AST Transformations는 Groovy에게 향상된 컴파일 시간 메타프로그래밍 기능을 제공하여 런타임 성능 없이 언어 수준에서 강력한 유연성을 제공합니다.'오렌스 벌칙'[33]입니다.

Groovy의 AST 예는 다음과 같습니다.

  • 카테고리 및 믹스인 변환
  • 불변 AST 매크로
  • 변환의 신규화
  • 싱글톤 변환

다른 것들 중에.

특성들

Groovy의 문서에 따르면, "트레이츠는 동작의 구성, 인터페이스의 런타임 구현, 동작 오버라이드, 정적 유형 검사/컴파일과의 호환성을 가능하게 하는 언어의 구조 구조입니다."

특성은 기본 구현과 상태를 모두 포함하는 인터페이스로 볼 수 있습니다.특성은 다음 키워드를 사용하여 정의됩니다.

특성 비행성 { /* 특성 선언 */   스트링 날다() { "난 날고 있어!" } /* 특성 내 메서드 선언 */ } 

그 후, 키워드를 사용해 통상의 인터페이스와 같이 사용할 수 있습니다.implements:

학급  용구 비행성 {} /* Bird 클래스의 기능에 FlyingAbility 특성을 추가합니다.* / 방어하다  = 신규 () /* 새 새 인스턴스화 */ 주장하다 .날다() == "난 날고 있어!" /* Bird 클래스는 FlyingAbility 특성의 동작을 자동으로 가져옵니다.*/ 

특성은 간단한 구성부터 테스트까지 광범위한 능력을 허용합니다.

도입

Groovy 도입의 주목할 만한 예는 다음과 같습니다.

  • Adaptavist ScriptRunner는 Groovy 구현을 통해 전 [34][35]세계 2만 개 이상의 조직이 사용하고 있는 Atlassian 툴을 자동화 및 확장합니다.
  • Apache OFBiz오픈소스 ERP(Enterprise Resource Planning) 시스템으로서 Groovy를 [36][37]사용합니다.
  • 클라우드 관리 시스템인 Eucalyptus는 상당한 양의 그루비를 사용합니다.
  • Gradle은 Groovy를 사용한 인기 빌드 자동화 도구입니다.
  • LinkedIn은 Groovy와 Grails를 일부 [38]서브시스템에 사용합니다.
  • 클라우드 기반 모니터링 플랫폼인 Logic Monitor는 스크립트 기반 데이터 [39]소스에 Groovy를 사용합니다.
  • Jenkins는 지속적인 통합을 위한 플랫폼입니다.버전 2에서 Jenkins는 Groovy로 [40]빌드 명령을 작성할 수 있는 파이프라인 플러그인을 포함합니다.
  • 라이프레이, 케일오 워크플로우에서 그루비를 사용합니다.
  • Sky.com은 Groovy와 Grails를 사용하여 대규모 온라인 [41]미디어 콘텐츠를 제공하고 있습니다.
  • Smart Things는 스마트 홈 및 소비자 사물 인터넷용 오픈 플랫폼이며 보안 지향 서브셋을 사용합니다[42].
  • SoapUI는 웹 서비스 테스트 [43]개발을 위한 언어로 Groovy를 제공합니다.
  • 시장조사 스타트업인 서바타는 그루비와 그라일을 [citation needed]사용한다.
  • 유럽특허청(EPO)은 Groovy에서 데이터플로우 프로그래밍 언어를 개발하여 "각국의 특허청과 통신하기 위한 프로세스의 유사성을 활용하고 이를 하나의 보편적인 [citation needed]프로세스로 변환합니다."
  • Groovy는 어떤 JVM 환경에도 통합할 수 있지만 JBoss Seam 프레임워크는 Java 외에 Groovy를 [44]개발 언어로 바로 제공합니다.
  • vCalc.com는 수학 크라우드 [45]소싱 엔진의 모든 사용자 정의 수학에 Groovy를 사용합니다.
  • Wired.com은 [46]웹 사이트의 제품 리뷰 섹션에 Groovy와 Grails를 사용하고 있습니다.
  • XWiki SAS는 공동 오픈 소스 [47]제품에서 Groovy를 스크립트 언어로 사용합니다.

IDE 지원

많은 통합 개발 환경(IDE) 및 텍스트 편집기가 Groovy를 지원합니다.

사투리

Groovy의 다른 구현은 다음과 같습니다.

  • Grooscript는 Groovy 코드를 JavaScript [48]코드로 변환합니다.Grooscript는 Apache Groovy에 비해 몇 가지 제한이 있지만 서버와 [49]클라이언트 모두에서 도메인 클래스를 사용할 수 있습니다.Grailes 버전 3.0에 대한 플러그인 지원 및 온라인 코드 [50]변환이 제공됩니다.

「 」를 참조해 주세요.

레퍼런스

인용문

  1. ^ a b "Releases - apache/groovy". Retrieved 2022-05-11 – via GitHub.
  2. ^ "Groovy Goodness: Default Groovy Script File Extensions".
  3. ^ "Groovy 2.0 Performance compared to Java". 25 Aug 2012.
  4. ^ "Java vs Groovy2.0 vs Scala Simple Performance Test". 10 Jul 2012. Archived from the original on 10 December 2012. Retrieved 7 October 2012.
  5. ^ a b "Groovy 2.4 And Grails 3.0 To Be Last Major Releases Under Pivotal Sponsorship". 19 Jan 2015.
  6. ^ a b "Groovy joins Apache Incubator". 11 Mar 2015.
  7. ^ James Strachan (29 Aug 2003). "Groovy - the birth of a new dynamic language for the Java platform". Archived from the original on 1 September 2003.
  8. ^ a b "Java Community Process JSR 241".
  9. ^ "Groovy wins first prize at JAX 2007 innovation award". 2007-04-26. Archived from the original on 2015-05-13. Retrieved 2012-10-07.
  10. ^ "They say a lot can happen over a cup of coffee". Archived from the original on 2011-04-19. Retrieved 2012-10-07.
  11. ^ "SpringSource Acquires Groovy and Grails company (G2One)". 11 Nov 2008.
  12. ^ "VMWare Acquires SpringSource". 10 Aug 2009.
  13. ^ "Tweet from James Strachan". November 24, 2016. Retrieved 2016-11-24.
  14. ^ "Announcement on dev mailing list".
  15. ^ 쾨니그 2007, 32페이지
  16. ^ "Groovy style and language feature guidelines for Java developers". Groovy.codehaus.org. Archived from the original on 2015-01-17. Retrieved 2015-01-22.
  17. ^ "Groovy – Differences from Java". Groovy.codehaus.org. Archived from the original on 2009-03-17. Retrieved 2013-08-12.
  18. ^ "What's new in Groovy 2.0?". 28 Jun 2012.
  19. ^ 쾨니그 2007, 37-8페이지
  20. ^ 쾨니그 2007, 38-9페이지
  21. ^ 쾨니그 2007, 페이지 41-3
  22. ^ "JN3525-MetaClasses". Archived from the original on 2012-10-01. Retrieved 2012-10-07.
  23. ^ "Metaprogramming Techniques in Groovy and Grails". 11 Jun 2009.
  24. ^ "Groovy - Closures". Archived from the original on 2012-05-22.
  25. ^ a b "그루비는 부분 애플리케이션을 '카레링'이라고 부릅니다", 2013년 8월 10일
  26. ^ "Groovy - Lazy Transformation". Archived from the original on 2012-10-08. Retrieved 2012-10-07.
  27. ^ "Side Notes: Lazy lists in Groovy". 3 Feb 2011.
  28. ^ "Groovy's Fold". 20 Jun 2011. Archived from the original on 13 February 2015. Retrieved 12 February 2015.
  29. ^ "Functional Programming with Groovy". 5 Nov 2011.
  30. ^ "Function programming in Groovy". Archived from the original on 2012-10-08. Retrieved 2012-10-07.
  31. ^ "JsonBuilder". Archived from the original on 2012-10-02. Retrieved 2012-10-07.
  32. ^ "Groovy Strings - Different ways of creating them". 26 Dec 2009.
  33. ^ "Compile-time Metaprogramming - AST Transformations". Archived from the original on 2012-10-14. Retrieved 2012-10-07.
  34. ^ "ScriptRunner Documentation".
  35. ^ "ScriptRunner Press Release with adoption stats".
  36. ^ "Groovy DSL for OFBiz business logic". Apache OFBiz Project Open Wiki.
  37. ^ "Simple-methods examples using Groovy". Apache OFBiz Project Open Wiki.
  38. ^ "Grails at LinkedIn". Retrieved 2015-06-02.
  39. ^ "Embedded Groovy Scripting". www.logicmonitor.com. Retrieved 2020-11-20.
  40. ^ "Jenkins Pipeline".
  41. ^ Rocher, Graeme (October 2, 2008). "Graeme Rocher's Blog: Sky.com relaunches written in Grails". Graeme Rocher's Blog. Retrieved 2015-06-02.
  42. ^ 새로운 스마트 홈 애플리케이션의 보안 분석
  43. ^ "Scripting and the Script Library Scripting & Properties". www.soapui.org. Retrieved 2015-06-02.
  44. ^ "Chapter 11. Groovy integration". docs.jboss.org. Retrieved 2015-06-02.
  45. ^ "vCalc, the First ever Social Platform for the world of Math". 4 November 2014. Retrieved 2016-05-05.
  46. ^ "Wired.Com" (PDF). www.springsource.org. Retrieved 2015-06-02.
  47. ^ "XWiki SAS" (PDF). www.springsource.org. Retrieved 2015-06-02.
  48. ^ "Grooscript Documentation". 12 Sep 2016. Archived from the original on 28 June 2017. Retrieved 4 July 2017.
  49. ^ "Presentation at SpringOne/2GX on Grooscript". 13 Dec 2015.
  50. ^ "Grooscript online conversions". 15 May 2017. Archived from the original on 9 July 2017. Retrieved 4 July 2017.

원천

외부 링크