2013년 7월 8일 월요일

Scala 와 Java 의 자료구조 변환 문제를 쉽게 해결합시다.

Scala의 장점 중에 하나가 상당히 다양하고, 강력한 자료구조 및 편의성을 제공하는 것입니다. 특히 자료구조를 병렬로 처리하는 것도 아주 쉽게 적용할 수 있습니다.
이런 Scala의 장점을 Java에서 사용하기 위해서 단순한 작업 두 가지만 해주면, Scala 의 강력한 자료구조를 쉽게 사용할 수 있습니다.

첫째는 maven으로 java와 scala 코드를 동시에 빌드할 수 있는 환경을 만드는 것이고,
둘째는 Java 자료구조와 Scala 자료구조를 쉽게 변환할 수 있도록 하는 것입니다.

첫째는 링크를 따라가시면 쉽게 환경을 구성할 수 있으니 생략하구요,
자료구조의 변환에 대한 코드만 보여드리겠습니다.
물론 제가 만든 게 아니라 Scala 에서 기본 제공하는 JavaConversions 라는 Object 를 사용하는 것입니다.

Java2Scala Object 를 보시면 모든 메소드가 implicit 로 정의되어 있습니다. 암묵 변환(implicit conversion) 이 되서, 개발자는 Object 를 import 하는 것으로 끝납니다.

Java2Scala.scala

import collection.{mutable, JavaConversions}
/**
* Java 자료구조 (Iterable, Iterator, List, Set, Map)와 Scala 자료구조 (Iterable, Iterator, List, Set, Map) 를
* 암묵적(implicit)하게 변환해줍니다.
* 사용 시 import kr.hconnect.core.collections.Java2Scala._ 를 해주시면 됩니다.
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 6. 27. 오후 1:43
*/
object Java2Scala {
implicit
def javaIterable2ScalaIterable[T](iterable: java.lang.Iterable[T]): Iterable[T] =
JavaConversions.iterableAsScalaIterable[T](iterable)
implicit
def javaIterator2ScalaIterator[T](iterator: java.util.Iterator[T]): Iterator[T] =
JavaConversions.asScalaIterator(iterator)
implicit
def javaList2ScalaBuffer[T](list: java.util.List[T]): mutable.Buffer[T] =
JavaConversions.asScalaBuffer[T](list)
implicit
def javaSet2ScalaSet[T](set: java.util.Set[T]): mutable.Set[T] =
JavaConversions.asScalaSet[T](set)
implicit
def javaMap2ScalaMap[K, V](javaMap: java.util.Map[K, V]): mutable.Map[K, V] =
JavaConversions.mapAsScalaMap[K, V](javaMap)
implicit
def scalaIterable2JavaIterable[T](iterable: collection.Iterable[T]): java.lang.Iterable[T] =
JavaConversions.asJavaIterable[T](iterable)
implicit
def scalaIterator2JavaIterator[T](iterator: collection.Iterator[T]): java.util.Iterator[T] =
JavaConversions.asJavaIterator[T](iterator)
implicit
def scalaBuffer2JavaList[T](buffer: collection.mutable.Buffer[T]): java.util.List[T] =
JavaConversions.bufferAsJavaList[T](buffer)
implicit
def scalaBuffer2JavaList[T](seq: collection.Seq[T]): java.util.List[T] =
JavaConversions.seqAsJavaList[T](seq)
implicit
def scalaBuffer2JavaList[T](mutableSeq: collection.mutable.Seq[T]): java.util.List[T] =
JavaConversions.mutableSeqAsJavaList[T](mutableSeq)
implicit
def scalaSetToJavaSet[T](set: collection.Set[T]): java.util.Set[T] =
JavaConversions.setAsJavaSet(set)
implicit
def scalaBuffer2JavaList[T](mutableSet: collection.mutable.Set[T]): java.util.Set[T] =
JavaConversions.mutableSetAsJavaSet(mutableSet)
implicit
def scalaMapToJavaMap[K, V](map: collection.Map[K, V]): java.util.Map[K, V] =
JavaConversions.mapAsJavaMap[K, V](map)
}

java 코드에서 scala 메소드를 사용할 때, java 의 list 나 set 을 전달하면, 알아서 scala 의 ArrayBuffer 나 HashSet으로 변환하여 작업한 후 결과도 java 의 자료구조 형식으로 변환합니다.

scala 의 implicit 기능을 사용하면 엄청난 유연성이 생깁니다.


댓글 없음: