C언어의 case문과 비슷하다. 그러나 스칼라에서는 패턴매팅으로 타입, 와일드카드, 시퀀스, 정규 표현식에 대한 판별은 물론 객체 상태를 깊이 관찰하는 것도 가능하다.
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)
}
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>
}
컴파일러는 모든 case절이 반환하는 값의 가장 가까운 슈퍼타입(최소 상위 바운드)을 추론한다.
x가 Any타입이기 때문에 값이 취할 수 있는 모든 경우를 처리할 수 잇는 case절이 필요하다.
그래서 기본절(8번 부분)이 필요한 것.
→ partialfunction 자체는 일부분의 값만ㅇ르 처리해주기위함의 목적이지만, 이러한 partialfunction이 아닌 경우 꼭 기본절을 마지막에 써줘야한다.
매치는 앞에서부터 차례대로 처리된다. 따라서 더 구체적인 절이 덜 구체적인 절 앞에 나와야 한다. 따라서 기본절은 가장 마지막에 나와야 한다. → 이는 컴파일러가 오류를 잡아준다.