C언어의 case문과 비슷하다. 그러나 스칼라에서는 패턴매팅으로 타입, 와일드카드, 시퀀스, 정규 표현식에 대한 판별은 물론 객체 상태를 깊이 관찰하는 것도 가능하다.

4.1 단순 매치

val bools = Seq(true, false)

for (bool <- bools) {
  bool match {
    case true => println("Got heads")
    case false => println("Got tails")
  }
}

이러한 경우 아래처럼 if문을 사용하면된다.

for (bool <- bools) {
  val which = if (bool) "head" else "tails"
  println("Got " + which)
}

4.2 매치 내의 값, 변수, 타입

for {
  x <- Seq(1, 2, 2.7, "one", "two", 'four)                           // <1>
} {
  val str = x match {                                                // <2>
    case 1          => "int 1"                                       // <3>
    case i: Int     => "other int: "+i                               // <4>
    case d: Double  => "a double: "+x                                // <5>
    case "one"      => "string one"                                  // <6>
    case s: String  => "other string: "+s                            // <7>
    case unexpected => "unexpected value: " + unexpected             // <8>
  }
  println(str)                                                       // <9>
}
  1. 여러 타입의 값이 섞여있기 때문에 Seq[Any] 타입의 목록을 사용한다.
  2. x는 Any 타입이다.

컴파일러는 모든 case절이 반환하는 값의 가장 가까운 슈퍼타입(최소 상위 바운드)을 추론한다.

x가 Any타입이기 때문에 값이 취할 수 있는 모든 경우를 처리할 수 잇는 case절이 필요하다.

그래서 기본절(8번 부분)이 필요한 것.

→ partialfunction 자체는 일부분의 값만ㅇ르 처리해주기위함의 목적이지만, 이러한 partialfunction이 아닌 경우 꼭 기본절을 마지막에 써줘야한다.

매치는 앞에서부터 차례대로 처리된다. 따라서 더 구체적인 절이 덜 구체적인 절 앞에 나와야 한다. 따라서 기본절은 가장 마지막에 나와야 한다. → 이는 컴파일러가 오류를 잡아준다.