부분 함수
부분 함수 (Partial Functions)
부분 함수(partial function)는 인자 타입의 모든 값에 대해 정의되지 않을 수 있는 함수예요. Scala에서 부분 함수는 PartialFunction[A, B] 트레잇을 구현하는 일항(unary) 함수입니다. 여기서 A는 인자 타입이고 B는 결과 타입이에요.
부분 함수를 정의하려면 match 표현식에 쓰는 것과 동일한 case를 사용해요.
val doubledOdds: PartialFunction[Int, Int] = {
case i if i % 2 == 1 => i * 2
}
부분 함수가 어떤 인자에 대해 정의되어 있는지 확인하려면 isDefinedAt 메서드를 사용해요.
doubledOdds.isDefinedAt(3) // true
doubledOdds.isDefinedAt(4) // false
부분 함수를 그 정의역(domain)에 속하지 않는 인자에 적용하려 하면 MatchError가 발생해요.
doubledOdds(4) // Exception in thread "main" scala.MatchError: 4
출처: Scala 3 Book
본문
부분 함수 사용하기 (Using partial functions)
부분 함수는 메서드의 인자로 전달할 수 있어요.
val res = List(1, 2, 3).collect({ case i if i % 2 == 1 => i * 2 }) // List(2, 6)
정의역에 없는 인자를 위한 기본값을 applyOrElse로 정의할 수 있어요.
doubledOdds.applyOrElse(4, _ + 1) // 5
두 부분 함수는 orElse로 합성할 수 있는데, 첫 번째 함수가 정의되지 않은 인자에 대해 두 번째 함수가 적용돼요.
val incrementedEvens: PartialFunction[Int, Int] = {
case i if i % 2 == 0 => i + 1
}
val res2 = List(1, 2, 3).collect(doubledOdds.orElse(incrementedEvens)) // List(2, 3, 6)
더 알아보기
- match 표현식과 패턴 매칭 — 부분 함수 정의에 쓰이는
case문 - Reference:
PartialFunction