생각해보면 C# 과 VB.NET 또는 J# 을 한 프로젝트에서 사용한 적이 있긴한데, 거의 실험용이였고, J# 이 도태되고, C# 이 발전하는 바람에 C# 으로만 개발을 했습니다.
Java 개발을 시작하고, Scala 도 알게되고, Groovy 도 알게 되었지만, 순수 Java 코드로만 개발을 했다.
물론 Scala 는 따로 프로젝트를 만들어서 공부하거나 실험하면서 기존 Java 로 된 라이브러리를 잘 사용했습니다만...
Java 개발 시에 Scala 코드나 라이브러리를 사용할 생각은 잘 못했습니다.
이번에 C# 코드를 Java 로 포팅하면서, Default Parameter 지원같이 코딩량을 줄일 수 있는 Scala 가 필요했는데, Java 와 Scala 코드를 동시에 사용하는 코드 개발 방법을 몰라 포기 했었죠.
몇번 시도 했는데, 상호 교차 참조 시에는 문제가 생기더군요... 쩝...
오늘 제대로 된 정보를 얻어 따라해보니 상호 교차 되어도 문제없이 컴파일과 실행이 되는 군요. ㅎㅎ
우선 Java 와 Scala 를 동시에 사용하여 개발하기는
http://www.codecommit.com/blog/scala/joint-compilation-of-scala-and-java-sources 를 참고하시면 됩니다.
전 maven 으로 개발하므로, maven 코드를 그대로 복사해서 사용했습니다.
그 전에도 비슷하게 만들어져 있었는다. compiler plugin 순서를 scala , java 순으로 해야 하더군요 ㅠ.ㅠ
요렇게 한 다음
ValueObjectBase.java
public abstract class ValueObjectBase implements IValueObject { //private static final long serialVersionUID = 5546630455380910528L; @Override public boolean equals(Object obj) { return obj == this || (obj != null && getClass() == obj.getClass() && hashCode() == obj.hashCode()); } @Override public int hashCode() { return System.identityHashCode(this); } @Override public String toString() { return this.buildStringHelper().toString(); } /** * {@link ValueObjectBase#toString()}을 재정의하지 말고, buildStringHelper를 재정의 하세요. */ protected Objects.ToStringHelper buildStringHelper() { return Objects.toStringHelper(this); } }
TimeVal.scala
class TimeVal extends ValueObjectBase with Comparable[TimeVal] { var time: DateTime = _ def this(duration: Duration) { this() this.time = new DateTime().withMillisOfDay(duration.getMillis.toInt) } def this(moment: DateTime) { this() this.time = new DateTime().withMillis(moment.getMillisOfDay.toLong) } def this(hourOfDay: Int, minuteOfHour: Int = 0, secondOfMinute: Int = 0, millisOfSecond: Int = 0) { this() time = new DateTime().withTime(hourOfDay, minuteOfHour, secondOfMinute, millisOfSecond) } def datetime: DateTime = this.time def hourOfDay: Int = time.getHourOfDay def minuteOfHour: Int = time.getMinuteOfHour def secondOfMinute: Int = time.getSecondOfMinute def millisOfSecond: Int = time.getMillisOfSecond def millis: Long = time.getMillis def getDateTime(moment: DateTime): DateTime = moment.withTimeAtStartOfDay().plus(millis) def getDateTime(date: DateVal): DateTime = date.getDateTime(this) override def hashCode(): Int = HashTool.compute(time) protected override def buildStringHelper() = super.buildStringHelper() .add("time", time) def compareTo(other: TimeVal) = { Guard.shouldNotBeNull(other, "other") time.compareTo(other.time) } } object TimeVal { def now: TimeVal = new TimeVal(DateTime.now()) }
TimeVal 사용 예
public static DateTime TimePart(DateTime dateTime) { return new TimeVal(dateTime).datetime(); }
Scala 언어로 된 TimeVal가 Java 클래스를 상속 받고, Class 를 사용하는 것은 당연하지만, 동시에 Java 코드에서 Scala 클래스와 Object를 사용하게 되었습니다.
이로서 코드량을 확연히 줄이거나, Scala 코드로 구현하는 것이 더 효과적일 때에는 자유스럽게 사용하게 되었습니다.
한손잡이보다 양손잡이가 더 좋겠죠? (물론 코드의 품질의 충분조건은 아닙니다^^)
댓글 없음:
댓글 쓰기