카테고리 없음2009. 3. 28. 20:43
자바와 그루비를 비교해 볼 수 있는 좋은 글이 있어서 소개합니다.


다음은 자바로 만든 Hello World 프로그램이다.

[code java]public class HelloWorld {
private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public String greet() {
return "Hello " + name;
}

public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Groovy");
System.out.println( helloWorld.greet() );
}
}[/code]

평범한 자바 소스다. 이 소스 파일을 그대로 그루비에서 groovyc 로 컴파일하거나, groovy 로 실행해보면, 한줄도 수정하지 않은 상태에서, 잘 실행해준다. 그루비 문법은 자바 문법을 대부분 수용한다.



이제 이 소스를 그루비답게 단계별로 고쳐보자...


우선 그루비에서는 세미콜론(;)과 public을 생략할 수 있다. 한줄에 명령문이 하나라면 세미콜론을 생략할 수 있고, public은 디폴트라서 생략할 수 있다. 또, 리턴(return)도 생략하자. 메서드의 마지막 문장이 return이면 생략할 수 있다.


[code groovy]
class HelloWorld {
    private String name

    void setName(String name) {
        this.name = name
    }

    String getName() { name }

    String greet() { "Hello "+name }
   
    static void main(String[] args) {
        HelloWorld helloWorld = new HelloWorld()
        helloWorld.setName("Groovy")
        System.out.println( helloWorld.greet() )
    }
}[/code]

이번에는 getName()에서 GString을 써보자.


[code groovy]
String greet() {
    return "Hello ${name}"
}
[/code]
${name} 부분에서 GString의 문자열 치환기능을 사용했다. 파이썬이나 다른 언어에서 본 적이 있을 것이다. 저걸 사용하면 문자열 다루기가 훨씬 수월해진다.

프로퍼티 자동 생성 기능도 사용해보자.


그루비에서는 setName, getName 따위의 메서드를 따로 만들 필요가 없다. 변수를 public으로 정의하면 그루비가 자동으로 getXXX(), setXXX()를 만들어준다.

[code groovy]
class HelloWorld {
    String name

    String greet() { "Hello ${name}" }
   
    static void main(String[] args) {
        HelloWorld helloWorld = new HelloWorld()
        helloWorld.name = "Groovy"
        System.out.println( helloWorld.greet() )
    }
}

[/code]

이번에는 괄호도 생략하고, 동적 자료형도 써보자. 그루비도 오리형(duck type)을 지원한다.

[code groovy]
class HelloWorld {
    def name

    def greet() { "Hello ${name}" }
   
    static main(args) {
        def helloWorld = new HelloWorld()
        helloWorld.name = "Groovy"
        println helloWorld.greet()
    }
}[/code]

String이 def로 바뀌었다. def로 정의한 변수는 오리형 변수가 된다.


마지막으로 그루비는 클래스파일을 생성할 수도 있지만, 동시에 스크립트로 호출할 수 도 있으니까. main 함수를 스크립트처럼 바꿔보자..


[code groovy]
class HelloWorld {
    def name
    def greet() { "Hello ${name}" }
}   

def helloWorld = new HelloWorld()
helloWorld.name = "Groovy"
println helloWorld.greet()
[/code]

마지막 예제만 보면 자바프로그램처럼 보이지 않겠지만, JVM 상에서 동작한다. 컴파일하면 class 파일도 만들어준다.

다시한번 ... 이 모든 것이 자바 가상 기계에서 돌아간다.

---


원문은 여기(http://groovy.dzone.com/news/java-groovy-few-easy-steps)에 있습니다.

Posted by jintopark
카테고리 없음2009. 3. 16. 00:04
요즘 진행중인 프로젝트에서 서블릿을 만들 때 자바 대신 그루비를 사용한다. 헌데 코드가 조금 복잡해지면서
OutOfMemoryError: PermGen space

라는 오류가 자꾸 발생했다. 일단 저 오류가 뜨고나면 톰캣이 더이상 동작하지 않는 상태가 된다.

이 문제로 5일이나 삽질한 끝에 방금 전에 해결했다.

여러가지 해결 책이 있겠지만, 일단 가장 쉬운 방법은 WEB-INF/lib 에서 mysql*.jar 를 삭제하는 것이다. 더불어 commons-logging*.jar도 삭제하자. 그러면 문제도 해결되고 애플리케이션 속도도 빨라진다.

그래도 해결이 안되고 계속 문제가 발생하면, 톰캣 실행옵션에
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

을 줘보자. 또는 -XX:MaxPermSize=256m도 효과가 있다고 한다. 나는 일단 jar파일들 삭제까지만 해서 문제가 해결되었다.
Posted by jintopark
카테고리 없음2009. 3. 2. 03:49
제가 번역한 책이 얼마뒤 나옵니다. 출판사(인사이트)의 블로그에 책소개가 올라왔습니다.

자바(Java)와 찰떡궁합인 스크립트 언어는?


Posted by jintopark
카테고리 없음2009. 2. 28. 21:01
기욤이 그루비 1.6에 대해 자세히 설명한 글이 InfoQ에 올라왔다. 가장 큰 변화는 속도 개선이라고 한다.

속도에 대해  ..
바라던 바고, 당연히 앞으로도 계속 진행해야 할 것이다. 현장에서 써보면 그렇게 많이 느리다는 생각은 들지 않는다.

다중 할당은 ..
가끔은 있었으면 하고 바랄 때가 있었다. 고마운 일이다.

어노테이션 완전 구현..
나는 잘 안쓰는 기능인데, 어쨌든 이번 버전부터 모든 기능을 지원하게 만들었다고 한다.

리턴 생략 (if,else, try,catch, finally)..
별로 좋아보이는 문법이 아니다. 패스

AST 변환..
꽤 재미있는 기능인데, 역시 익숙해지려면 시간좀 걸리겠다.  말로 설명하면 길고, 간단하게 예제중에@Singleton이라는 것을 보자

아래는 전형적인 싱글톤 클래스다

public class T {
    public static final T instance = new T();
    private T() {}
}
한 줄이면  같은 코드를 만들 수 있다.
@Singleton class T {}
이런 인자를 주면 어떻게 될까

@Singleton(lazy = true) class T {}
생성되는 코드는 이런 식이 된다.
class T {
    private static volatile T instance
    private T() {}
    static T getInstance () {
        if (instance) {
            instance
        } else {
            synchronized(T) {
                if (instance) {
                    instance
                } else {
                    instance = new T ()
                }
            }
        }
    }
}

이 밖에도 @Immutable, @Lazy, @Delegate, @Newify, @Category, @Mixin, @PackageScope, @Grab 등이 있다.

이외에도 읽어볼만한 내용들이 꽤 있는데, 실전에서 적용해보지 않은 상태라 뭐라 말하기 힘들다. 재미있어보이거나, 적용해보게되면 또 올리겠다.
Posted by jintopark
카테고리 없음2009. 2. 23. 09:50
그루비 1.6 이 발표되었는데, 데비안용 설치파일을 찾을 수 없어서 적용하지 않고 있었다.

구글링 해서 찾았다. 여기. 기존 프로젝트에 적용해보니 일단 정상동작한다.
Posted by jintopark
카테고리 없음2009. 2. 23. 07:44
그루비에서 가장 재미있는 문법은 클로저다. 클로저란 코드가 들어있는 블록을 말하는데, 이렇게 생겼다.
def adder = { x, y -> return x+y}
println adder(4,3)
println adder.call(4,3)
실행해보면 7 이 두번 출력된다.

메서드처럼 클로저도 인자에 디폴트 값을 지정할 수 있다.

def adder = { x, y = 3-> return x+y}

println adder(4,3)
println adder.call(4)
역시 7 이 두번 출력된다.

하지만 메서드처럼 쓸 수 있다는 것은 그다지 큰 충격이 아니다. 그보다는, 메서드를 호출하면서 "코드블럭"을 전달 할 수 있다는 것. 그럴싸해보인다.
def repeater(count, Closure worker) {
    count.times{worker(it);}
}
repeater(100) {println it}

자바니까, 식별자들에 한글도 들어간다.

def 반복해(횟수, Closure 일꾼) {
    횟수.times{일꾼(it);}
}
반복해(100) {println it}
Posted by jintopark
카테고리 없음2009. 1. 16. 23:34
그루비에서 SWT를 쓰는 방법 (먼저 자바1.4 또는 자바 5를 설치해주세요.)

0. 그루비를 설치한다. (요즘 안정버전은 1.5.7이다)

1. Eclipse-libs.ZIP을 다운로드 받는다.

2. 파일을 WORK/lib 에 푼다.  (WORK는 작업디렉토리)

3. WORK 디렉토리에 r.groovy 파일을 만들고 다음과 같이 적는다.
 def loader = this.class.classLoader.rootLoader
 def dir = new File('lib')
 dir.eachFileMatch(~/.*\.jar$/) {
     loader.addURL(it.toURL())
}
evaluate(new File('test.groovy'))


4. test.groovy 에는 다음과 같이 적는다

import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.* 

def swt = new groovy.swt.SwtBuilder()
def shell = swt.shell(text:'Groovy / SWT Test') {
    rowLayout()
    label(style:"none", text:'Simple demo of Groovy and SWT')
    button(style:"push", text:'  Push Me  ') {
        onEvent(type:"Selection", closure:{ println "Hello" })
    }
}

shell.pack()
shell.open()
while (!shell.disposed) {
  if (!shell.display.readAndDispatch()) shell.display.sleep()
}


5. 이제, 프롬프트에서 다음 명령을 내리면 화면에 SWT로 만든 어플리케이션이 보인다.

C:\WORK\>groovy r.groovy


사용자 삽입 이미지

http://groovy.codehaus.org/GroovySWT 에서 베껴왔다.

Posted by jintopark
카테고리 없음2008. 5. 5. 12:16
그루비 1.6 베타 1 이 나왔는데, 속도개선이 가장 큰 이슈라고 주장하고 있다. "최고 460%까지 속도가 향상되었어요"라고 한다.

그럼, 그전에는 그렇게나 느렸어요? 라는 질문이 떠오르긴 하지만. ^^

이렇게 빨라진 가장 큰 이유는 call site cache기법때문이라고 한다. 루비나 그루비나 메서드호출을 동적으로 할 수 있다는 점이 언어의 강점인데, 동적호출은 비용이 많이 드는 일이다.

한번 호출하면 그 기록을 가지고 있다가 똑같은 호출이 발생하면 이런 저런 계산을 거치지 않고 기억해두었던 메서드를 다시 호출한다는 것이 call site cache 기법. JRuby에서는 이미 1년전부터 적용하고 있었단다.

그루비가 이제서야 JRuby랑 겨룰 수 있게 되었다. 하지만, 아래쪽에 있는 하이버네이트나 스프링덕분에 Grails의 속도는 그렇게 빨라지기는 힘들지 않을까.

어쨌든, 이 글이 이번 사건에 대해 가장 냉정한 분석인 것 같다.

Posted by jintopark
카테고리 없음2008. 4. 27. 02:13
그루비 1.5.6 이 나왔다.

1.5.5 에서 바뀐 것들을 보고있으면 어쩐지 그루비란 것이 아직은 쓸만하지 않은 건 아닌가, 의심이 들기도한다. 하지만 반대로 저렇게 열심히 버그를 잡고 있다는 것은 프로젝트가 살아있다는 뜻이기도 하겠다.

G2One and the Groovy development team is pleased to announce the release of Groovy 1.5.6, a bug fix release for the stable Groovy 1.5.x branch.

A regression introduced in 1.5.5 was fixed, and 35 bugs have been resolved (generics, MOP, and joint compiler issues, better line information for IDE support, etc)

As usual, you can download the latest Groovy dustribution and read the change log to know all the details. (from http://groovy.dzone.com/news/groovy-156-released)


Posted by jintopark
카테고리 없음2008. 4. 15. 13:49
그루비 컴파일러가 느리다는 생각은 안하고 있었는데, 개발팀에서는 열심히 컴파일 속도를 높이고 있었단다.

http://glaforge.free.fr/weblog/index.php?itemid=238

우짜둥둥 이번 릴리즈 (1.5.5)에서는 컴파일 속도가 3배에서 5배까지도 빨라졌다고 한다. 그루비로 만든 프로그램의 속도에 대한 이야기가 없는 걸로 봐선... 그쪽은 신경쓰기 힘든가보네..
Posted by jintopark

 

 
«이전  1 2 3 4 5  다음»