Scala
Scala의 Option
lispholic
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의 Option
은 Null 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 검사 비슷한 것을 해야한다.