2008.5.13 translation & editing by gilbird

원문:http://groovy.codehaus.org/Differences+from+Java

그루비는 되도록 자바 개발자에게는 자연스럽게 와닿을 수 있도록 노력했습니다.
그루비를 설계할 때 자바 배경지식을 가진 사람이 그루비를 사용한다면 최소한의 차이점만을 느끼도록 한다는 원칙으로 만들었습니다.

다음은 자바와 그루비의 주요 차이점입니다.

기본 import

아래 패키지와 클래스는 기본적으로 import합니다.
따라서 명시적으로 import문으로 아래 나와 있는 패키지/클래스는 이미 import되어 있으니까 굳이 소스에 넣지 않으셔도 됩니다.

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

일반적인 차이점

다음은 그루비를 시작하는 자바 개발자가 흔히 겪는 일들입니다.

  • ==는 모든 형식에서 일치함을 의미합니다.
    자바에서는 이상하게도 ==가 기본형(primitive type)의 일치는 물론 객체가 일치함을 뜻하기도 합니다.
    그루비에서는 오토박싱(autoboxing을 사용하므로 자바 개발자에게는 아주 혼란스러울 수도 있습니다.
    ( x가 5였다면 x==5는 일반적으로 false일 것입니다. 그래서 그루비에서는 ==는 equals()를 뜻합니다.)
    객체가 일치하는지 알아내려면 foo.is(bar)와 같이 "is" 메서드를 사용하면 됩니다. 
    이 방식은 null에서는 동작하지 않지만 foo==null과 같이는 사용할 수 있습니다.
  • in은 키워드입니다. 따라서 변수명으로 사용하면 안됩니다.
    (역자주: for i in 1..10 과 같이 for문에서 사용합니다.)
  • 배열은 아래와 같이 선언하면 안됩니다.
    int[] a = {1,2,3};
    대신 아래와 같이 씁니다.
    int[] a = [1,2,3]
  • 자바에서는 아래과 같은 for 루프를 주로 썼을 겁니다. 
    for (int i=0; i < len; i++) {...}
    그루비에서는 위 코드 그대로 쓸 수 있습니다.
    하지만 아래와 같이 하나의 카운트 변수만을 사용하는 것이 훨씬 그루비답습니다.
    for (i in 0..len-1) {...}
    for (i in 0..<len) {...}
    len.times {...}

주의할 점

  • 세미콜론은 굳이 안써도 됩니다. 취향에 따라 사용하면 됩니다.
    (하지만 한줄에 2개 이상의 명령문을 사용할 때에는 구분을 위해 넣어야 합니다.)
  • return 키워드는 선택사항입니다.
    (역자주: 제일 마지막에 있는 명령문의 결과가 리턴되는 구조입니다.)
  • this 키워드는 (this 클래스를 참조하는) 정적 메서드에서 사용할 수 있습니다.
  • 메서드와 클래스는 기본적으로 public입니다.
  • 그루비의 protected는 자바의 protected와 같은 의미입니다.
    즉, 동일한 패키지와 상속한 클래스에서 protected 멤버를 액세스할 수 있습니다.
  • Inner 클래스는 지원하지 않습니다. 대신 클로져를 사용하기 바랍니다.
  • 메소드 식의 throw 절은 그루비 컴파일러에서 검사하지 않습니다.
  • 자바에서의 undefined members 혹은 인자 형식 오류 등에 대하여 컴파일 오류가 발생하지 않을 것입니다.
    런타임 vs 컴파일타임, 정적 vs 동적 글을 참고하기 바랍니다.

특별한 차이점

자바 프로그래머는 명령어 종료로 세미콜론(;)을 사용하며 클로져는 쓰지 않습니다.
또한 클래스 정의에서 인스턴스 초기화를 합니다. 아래 코드를 보기 바랍니다.

class Trial {
  private final Thing thing = new Thing ( ) ;
  { thing.doSomething ( ) ; }
}

많은 그루비 프로그래머는 세미콜론을 사용하면 산만하고 중복이 많아 쓰길 꺼려 합니다.
(하지만 어떤 사람들은 항상 사용합니다. 코딩스타일에 따라 다르죠.)
위 코드를 아래와 같이 쓰면 문제가 생깁니다.

class Trial {
  private final thing = new Thing ( )
  { thing.doSomething ( ) }
}

위 코드는 MissingMethodException이 throw될 것입니다.

이 상황에서의 문제는 줄바꿈(newline)은 명령 종결자가 아니라서 다름 블록을 클로져로 인식하여 Thing 생성자에 인자를 전달해 버립니다. 이상하게 느껴지겠지만 사실입니다. 의도한 방식으로 인스턴스를 초기화 하고 싶다면 세미콜론을 사용하는 것이 필수적입니다.

class Trial {
  private final thing = new Thing ( ) ;
  { thing.doSomething ( ) }
}

위 코드의 초기화 정의 다음 블록은 확실히 인스턴스 초기화를 수행합니다.

다른 문서에서 알아야 할 몇가지 함정과 회피하기 위한 최선의 예를 참고하기 바랍니다.

자바에서는 사용 불가능한 그루비에 추가된 새로운 기능

  • 클로져
  • 리스트와 맵에 대한 네이티브 문법
  • GroovyMarkup, GPath 지원
  • 정규식에 대한 네이티브 지원
  • 여러가지 모양의 iteration과 강력한 switch문
  • 동적, 정적 형식을 지원함으로써 메서드, 필드, 변수의 형식을 생략해도 됨
  • 문자열 안에 식을 넣을 수 있음
  • JDK에 수많은 헬퍼 메서드가 추가됨
  • 빈(bean)의 속성을 쓰고 이벤트 리스너를 추가하는데 간단한 문법
  • ?. 연산자를 이용한 안전한 액세스. 예를 들면 "variable?.field"와 "variable?.method()"로 더이상 중첩루프 덩어리를 만들어 널체크를 안해도 됨