Partial Function을 사용하면 특정 부분 집합에 대한 함수를 정의할 수 있다. (Partial Function이 무엇인지 기억이 나지 않는다면 Partial Function을 정리한 포스트에서 확인할 수 있다.)
대표적인 예가 밑과 같은 코드이다.
type Divide = (Double, Double)
val div:PartialFunction[Divide, Double] = {
case (x, y) if y != 0 => x/y
}
Double형인 2개의 데이터를 입력 받았고, 분모 역할을 하는 두 번째 수가 0이 아닐 때 선언된 함수이다.
예제 Partial Function은 위와 같이 사용된다. Partial Function은 isDefinedAt
메서드를 통해 값들을 체크할 수 있지만 번거롭기도 하다.
물론 validation을 위한 함수를 위와 같이 작성해도 된다. 실제로 잘 동작하기도 하지만 scala에서 lift를 사용하여 나타내는 것이 더 관용적이다.
def safeDivide(input:Divide) = {
div.lift(input).map(result => s"나눗셈의 결과값은 ${result}입니다.").getOrElse("0으로 나눌 수 없습니다.")
}
위의 lift
method를 사용한다면 isDefinedAt
을 사용하여 validation을 구현한 함수와 똑같이 동작하는 것을 알 수 있다.
lift
를 사용하면 PartialFunction[Divide, Double]
이었던 div
가 Function[Divide, Option[Double]]
이 된 것이다.
lift
메서드의 또다른 사용 용례로는 index out of bound
를 피하기 위한 용례이다.
위에서 볼 수 있듯, 인덱스를 벗어나는 11
을 입력해도, lift
를 사용한다면 Exception 대신 None
을 리턴하는 것을 알 수 있다.