2013년 1월 6일 일요일

Scala 와 Java 의 가변인자(varargs)를 가진 메소드를 상호 호출하는 방법

Java 에서 가변인자 형식을 사용하는 방식은 다음과 같습니다.

void javaPrint(String: format, Object... args)

Scala 에서는 다음과 같이 표현합니다. 물론 AnyRef* 보다 Any* 를 사용하면 primitive type 들도 가능합니다.

def scalaPrint(format:String, @varargs args: Any*)


먼저 Java에서 Scala 로 만들어진 scalaPrint() 를 가변인자 형식으로 호출하게하기 위해 @varargs를 지정하게 하면 됩니다.

그럼 Scala 언어에서 Java 로 만든 javaPrint 를 호출하려면 다음과 같이 해야 합니다.

@varargs
def wrappingJavaPrint(format:String, args: Any*) {
    javaPrint(format, args.map( _.asInstanceOf[AnyRef]) : _* )
}

로 호출하면 java 의 가변형식을 호출합니다.
"_*" 를 붙이는 이유는 Scala compiler 에게 가변인자로 호출함을 명시적으로 알려주게 됩니다.

 Scala 2.8에서는 이런 문제가 좀 많았는데, 그 후로는 이런 방식으로 정착된 것 같습니다.
전 위의 방법을 몰라서, 좀 헤맸습니다^^

댓글 없음: