Scala에는 Option이라는 재미있는 클래스가 있습니다. 이 클래스는 기본적으로 옵셔널(Optional, 존재 여부가 불확실함)한 값을 표현하기 위해 사용하며, 아래와 같은 정의로 구성되어 있습니다.
object Option은 주로 Empty Option 값(None)을 만들어내기 위해 사용합니다. 이 글에서는 Companion class Option 에 대해 주로 다룰 예정입니다.
보다시피, class Option의 선언 옵션 중 sealed 때문에 부가적인 확장이 불가능하며, abstract 때문에 Option 인스턴스를 생성할 수 없습니다. 따라서, Option의 실제 인스턴스는 Scala 패키지에서 class Option을 확장하여 제공하는 Some과 None 입니다.
일반적으로 Scala의 Option 인스턴스는 모나드(monad) 형태로 사용하는 것이 이상적으로 알려져 있습니다. (ScalaDoc > class Option, 이 경우에는 Option - Some, None이 모나드임) 이 방식에는 대표적으로 map, flatMap, filter, foreach 등의 메소드가 있습니다.
None은 Option[Nothing]을 상속하는 object입니다. object이기 때문에 singleton으로 존재하며, Null 대신 사용하여 NullPointerException을 방지할 수 있는 부수효과가 있습니다. (단, None의 값을 가져오려고 시도하면 NoSuchElementException이 발생하기 때문에 근본적으로는 프로그래머의 주의를 요함) 이를 이용하여 예외처리를 하나로 모을 수 있다는 장점이 있습니다. 예를 들어, List 처리 중 Null을 리턴하는 대신 None을 리턴하면 모나드의 특성 상 별도의 중간 처리 없이 최종 결과를 모을 수 있습니다. 그리고 최종 결과에서 None을 걸러내는 식으로 예외처리를 합니다. (물론 기존처럼 None으로 걸러내는 개별 과정에서 처리 가능)
+) Option을 생성하는 함수(unit function)는 Some(value)와 None이 있지만, 임의의 변수 x로부터 Option을 생성하는 경우 사용하는 생성 함수로 Option.apply(x)가 있습니다. 아래 코드에서 볼 수 있는 것 처럼 object Option의 apply 함수이며, Scala 문법의 특성(?) 상 Option(x)로 쓸 수 있습니다. (x의 값에 따라 null 이면 None, 아니면 Some(x)가 나옵니다.)
'Programming Languages' 카테고리의 다른 글
이상한 Kotlin의 세계 - Iterable.map() (0) | 2020.01.17 |
---|---|
[추상자료형] 리스트(List) (0) | 2016.09.18 |
[추상자료형] 집합(Set) (0) | 2016.09.13 |