어떤 값이 있을 수도, 없을 수도 있는 상황에 쓸 수 있는 간단한 형태의 컨테이너 클래스가 스칼라에 있습니다. Option이란 클래스인데요. 이 클래스는 추상 클래스라서 인스턴스를 만들 수 없고 코드에서는 이 클래스의 하위 클래스인 Some이나 None을 사용합니다. Some은 값이 있음을 나타내고 그 안에 해당 값을 가지고 있습니다. 반면에 None은 값이 없음을 의미하며 아무런 값도 가지지 않습니다.
Option 클래스는 Map, List 같은 집합형으로 자료를 관리하려는데 특정 값이 있을 수도 있고 없을 수도 있다면 null을 넣는 대신 사용할 수 있습니다. 보통처럼 null을 넣게 되면 값을 집합형에서 꺼내면서 null인지 확인해야 하는데 이 사실을 문서화 해 놓더라도 자주 잊어버려 NullPointerException이 생기곤 합니다. 잊지 않고 기억한다 하더라도 매번 꺼낼 때마다 null인지 확인해야 하는 번거로움도 있습니다.
Map<String, Integer> repository = new HashMap<String, Integer>();
repository.put("key1", 1);
repository.put("key2", null);
if(repository.get("key2") == 1) { ... } // 예외 발생
이때 Option을 사용하면 값이 없을 때 기본값으로 대신 처리하도록 하거나 강제로 값이 없는지 판단하도록 할 수 있습니다.
Map<String, Option<Integer>> repository = new HashMap<String, Option<Integer>>();
repository.put("key1", Option.some(1));
repository.put("key2", Option.none());
if(repository.get("key1").getOrElse(0) > 0) { ... } // 기본값 사용
if(repository.get("key2").isDefined()) { // 값 유무 여부를 판단
int value = repository.get("key2").get();
}
Option 유용하게 사용할만한 또 다른 곳은 반환 값입니다. 어떤 질의 메서드를 호출하고 결과로 값을 받는데 값이 없을 때는 null이 오거나 예외가 발생합니다. 값이 없지만 굳이 확인해야 할 필요가 없을 때는 메서드가
Null 객체를 반환하기도 합니다.
값이 없다는 사실을 null을 반환함으로써 표현하는 경우, 집합형을 쓸 때처럼 받는 쪽에서 null인지 확인하는 절차를 잊을 수도 있고 매번 null을 확인하는 불편을 감수해야 합니다. 이 때 메서드의 반환값이 없을 수도 있음을 명시적으로 나타내면서 간단히 처리하도록 하는데 Option이 좋습니다.
깃헙 기스트에 테스트 코드와 함께 올려 놨습니다.
https://gist.github.com/1263813