Scala의 Option

Scala 2009. 10. 18. 21:26

Scala에는 Option이라는게 있는데 이것을 이용하면 귀찮은 코드를 줄일 수 있다. 예를 들어 java 에서는 뭔가를 리턴해야하는데 그럴 수 없는 경우 보통 null을 리턴한다. 그러면 받는 쪽에서는 받은게 null이 아닌지 항상 확인해야 한다.

    SomeObject obj = callSomeMethod() ;
    if (obj == null) {
        // 받은게 없는 경우 동작
    }
    else {
        // 정상 객체를 받은 경우 동작
    }

이런 귀찮은 것을 처리하기 위해 Null Object Pattern 을 쓰기도 한다. 즉 null을 리턴하는 대신에 아무 것도 아닌 객체를 리턴하는 것이다. Effective Java에는 배열이나 컬렉션을 리턴해야 할 때 리턴할게 없으면 null을 리턴하지 말고 빈 배열을 리턴하라는 내용이 나오는데 이것도 같은 것이다.

Scala의 OptionNull Object Pattern을 일반화시켜 쓰기 쉽게 해 놓은 것이다. 어떤 메소드의 리턴 타입이 Option인 경우 리턴할 객체를 Some으로 감싸서 리턴하거나 리턴할 게 없으면 None을 리턴하면 된다.

    def func(a : Int) : Option[String] = {
         if (a > 0) Some(a.toString) else None
    }

Option은 컬렉션 인터페이스를 구현했기 때문에 map() 메소드를 이용하여 필요한 필요한 동작을 수행하면 된다. Some을 받았다면 감싸고 있는 객체에 대해 뭔가 동작을 하게 되고, None을 받은 경우에는 아무 것도 하지 않게 된다. 이렇게 함으로써 받는쪽에서 null검사를 할 필요가 없어진다.

    val b = func(0) ;
    b.map{print _} ; // 출력 없음
    val c = func(1) ;
    c.map{print _} ; // 1 출력

다만 이것에 단점도 있는데, 뭔가를 리턴할 때는 객체를 하나 더 만들게 된다는 것이다. 그리고 리턴받은게 없은 경우 뭔가를 해야한다면 결국 null 검사 비슷한 것을 해야한다.

Posted by lispholic
,