직역하면 Partial Function
은 부분 함수이다. 이를 풀어 쓰면 다음과 같다. f:X → Y
인 함수에 대한 부분 함수는 g:X' → Y
이다. 이때, X'는 X의 subset이다.라는 것이 Partial Function의 정의이다.
스칼라의 partial function
은 가능한 입력 인자의 서브셋에 대해서만 정의된 함수를 뜻한다. Partial Function의 좋은 예시 중에는 나눗셈
이 있다. 나눗셈은 분모의 input이 0이 아닌 모든 실수 subset에 관해 정의된 함수이다. 이를 코드로 나타내면 다음과 같다.
val div: (Double, Double) => Double = {
case (x,y) if y!=0 => x/y
}
즉, 2개의 인자가 입력되었을 때 분모를 나타내는 y가 0이 아닌 경우 x/y를 리턴하는 것이다. 이를 실제 실행시켜보면 다음과 같이 동작한다.
우리는 위의 실행화면에서 div(1,0)
, 즉 분모가 0이 입력되는 예외가 발생했을 때 MatchError
가 발생하는 것을 알 수 있다. 그리고 위에서는 나와있지 않지만 입력인자가 유효한 값의 서브셋이라면 테스트할 방법이 없다는 것이다.(대신 함수 자체를 호출한다.)
스칼라는 위의 문제점들을 해결하기 위해 PartialFunction
이라는 trait를 제공한다. PartialFunction
을 사용하여 함수를 정의한다면 입력 인자에 정의되었는지 검사할 뿐만 아니라 누락된 패턴을 경고하지 않을 것이다.
위의 예시를 PartialFunction
을 사용하면 다음과 같이 나타낼 수 있다.
val div: PartialFunction[(Double,Double), Double] = {
case (x,y) if y!= 0 => x/y
}
PartialFunction 내부에는 2개의 타입이 들어간다. 위에서는 [(Double, Double), Double]
이지만 간략히 하면 [A, B]
의 형태이다. 이는 PartialFunction
에 A
타입이 input으로 들어가고 output으로 B
타입의 값이 나온다는 의미이다.
다시 예제로 돌아가서, 위의 예제는 맨 처음 예제와 다를 것이 없어보인다. 하지만, 유일한 차이점으로 PartialFunction
이 isDefinedAt
이라는 메서드를 통해 해당 input에 대해 처리할 수 있는지를 알려준다.
타입 오류 역시 검출해주며, 정의되어 있지 않은 연산은 false
를 리턴하여 누락된 패턴에 대해 미리 검사하여 이상이 없을지 여부를 검증할 수 있다.