Java 소스를 Scala로 전환할 때 null 값 처리는?

2015-12-27 12:07

Scala 기반으로 구현할 때는 null 값을 사용하지 말고 Option을 사용하는 것이 더 좋다. 따라서 Java에서 null로 구혀되어 있던 부분을 Scala의 Option을 사용하도록 변환하는 것이 더 좋다. Scala에서 Option 사용하는 방법은 다음과 같다.

String x = ...
if (x != null) {
  doSomething(x);
}

위와 같이 Java로 구현되어 있는 코드를 Scala에서는 다음과 같이 구현할 수 있다.

val x: Option[String] = ...
if (x.isDefined) {
  doSomething(x.get)
}

또는

val x: Option[String] = ...
x match {
  case Some(x1) => doSomething(x1)
  case None => // do nothing
}

위 예제 코드는 Option in Scala vs null in Java에서 인용했다.

위와 같이 구현하려면 Java에서 null로 처리될 수 있는 값을 Scala의 Option으로 변경할 필요가 있다. Scala Option으로 변환할 때 Some을 사용하면 된다.

val i: Option[Int] = Option(1)

위와 같이 구현하면 Some의 apply method가 실행되면서 Option을 생성해 준다. 값이 null인 경우 None이 반환된다. Option apply method의 doc 문서를 보면 "An Option factory which creates Some(x) if the argument is not null, and None if it is null."와 같이 설명하고 있다.

Option의 apply method 구현부는 다음과 같다.

def apply[A](x: A): Option[A] = if (x == null) None else Some(x)

예를 들어 다음 코드를 실행하면 결과가 다르다.

  @Test def option(): Unit = {
    println(Option(null))
    println(Option("abc"))
    println(Some(null))
    println(Some("abc"))
  }

위 테스트를 실행한 결과는 다음과 같다.

None
Some(abc)
Some(null)
Some(abc)

따라서 자바 소스 코드의 null 값에 따라 Some과 None으로 분리해서 생성하려면 Option을 사용해야 한다. Some과 None은 Option의 하위 클래스이고, Option apply method는 Some과 None의 Factory method라고 생각하면 된다.

final case class Some[+A](x: A) extends Option[A] {
  def isEmpty = false
  def get = x
}

case object None extends Option[Nothing] {
  def isEmpty = true
  def get = throw new NoSuchElementException("None.get")
}

0개의 의견 from SLiPP

의견 추가하기

연관태그

← 목록으로