부분 함수

부분 함수 (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)

더 알아보기