Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Groovy] String과 GString Computer & Program

Groovy에는 일반적인 String 말고 GString이라는 것이 있다. String 객체를 생성할 때 일부분이 계산된 값으로 할당된다. ${...} 구문을 사용하면 된다.
def name = 'Sigel'
println "A: My name is $name"
println (/B: Hi, ${name}/)

A: My name is Sigel
B: Hi, Sigel


Groovy에서 String 객체를 생성하는 방법은 정말 많다. 하지만 이 중 GString 객체가 되는 것은 쌍따옴표(세 개의 쌍따옴표 포함)로 생성하고, ${...} 구문을 가지고 있는 녀석이다.(라고 문서에는 나와있는데, 슬래시로 생성한 String 객체도 된다.)
  • 따옴표(', single quote)
  • 쌍따옴표(", double quote)
  • 세 개의 쌍따옴표(""", triple double quote -ㅅ-;;)
  • 슬래시(/, slash)

println '${name} is testing'
println "${name} is testing"
println """${name} is testing"""
println (/${name} is testing/)
println '${name} is testing'.getClass()
println "${name} is testing".getClass()
println """${name} is testing""".getClass()
println (/${name} is testing/.getClass())

${name} is testing
Sigel is testing
Sigel is testing
Sigel is testing
class java.lang.String
class org.codehaus.groovy.runtime.GStringImpl
class org.codehaus.groovy.runtime.GStringImpl
class org.codehaus.groovy.runtime.GStringImpl


그리고 GString은 lazy loading을 한다. 문자열 객체를 사용하기 전 까지(toString()으로 호출되기 전까지)는 생성하지 않는다. 그 예로 GString을 이렇게도 사용할 수 있다.

def two = 0
println new Date()
x = "It is currently ${ println 'blah blah'; two = 1; new Date() }"
assert x.values[0] instanceof Date
y = "It is currently ${ writer -> two = 1 + 1; writer << new Date() }"
assert y.values[0] instanceof Closure
sleep 5000
println "${two} is one"
println x
println y
println "${two} is two"

Sat Oct 06 01:03:46 KST 2012
blah blah
1 is one
It is currently Sat Oct 06 01:03:46 KST 2012
It is currently Sat Oct 06 01:03:51 KST 2012
2 is two

values 배열을 통해서 GString에서 ${...}의 결과를 다시 사용할 수 있다. ${...}는 클로저이다. 하지만 전달인자가 있느냐에 따라 반환되는 값이 달라진다.

x에서 사용된 것처럼 전달인자가 없는 클로저는 클로저 내의 구문을 수행하고 마지만 줄이 반환된다. 따라서 'blah blah'도 출력하고 two 변수의 값도 변경한다. 그리고 마지막에 Date 객체가 반환되어 x의 나머지 문자열과 조합이 된다.

y에서 사용된 것처럼 전달인자가 1개 있는 클로저는 실제 클로저로 사용되고, 전달인자 writer는 결과를 반환할 때 사용된다. 클로저이기 때문에 실제 동작은 5초 동안 sleep을 한 다음에 수행이 되며, x 보다 5초가 더 늦은 시각이 찍히게 된다.

전달인자가 1개 이상인 클로저는 사용이 불가능하며, GroovyRuntimeException을 발생시킨다.



GString은 JSTL과 같은 템플릿처럼 이용되거나 GSQL과 같은 경우로 사용되면 좋을 것 같다.


- 출처 : Groovy - Strings and GString

핑백

  • Sigel's house made of ice 。。。 : [Groovy] RegEx를 사용할 때 미묘한 차이 2012-10-16 22:38:36 #

    ... 거나 하면 원치 않은 결과가 나올 수 있으니 조심해야 한다. 그리고 여기서는 문자열을 생성하는데 single quote(', 따옴표)만 사용했는데, groovy는 문자열을 여러 방법으로 생성할 수 있으니 모두 써보자. 1. ~'패턴'은 Pattern 객체를 생성한다. def pattern = ~'foo' assert pattern ... more

덧글

댓글 입력 영역

Google AdSense (text/image)