값을 패턴에 대해 검사하는 매커니즘이다.

성공적인 매치는 구성 요소로 값을 분해해낼 수 잇다.

자바의 switch문과 비슷하다.

Syntax

import scala.util.Random

val x: Int = Random.nextInt(10)

x match {
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}

import scala.util.Random

val x: Int = Random.nextInt(10)

x match
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"

→ x는 0~10까지의 랜덤 숫자이다.

마지막 케이스 _ 는 전부다 캐치하는 경우이다. 캐이스들은 모두 대안이라고 부른다

def matchTest(x: Int): String = x match
  case 1 => "one"
  case 2 => "two"
  case _ => "other"

matchTest(3)  // returns other
matchTest(1)  // returns one

→ 반환값이 모두 스트링 타입 값이다. 그러므로 함수 matchTest는 스트링을 반환한다.

matching on case class

sealed trait Notification

case class Email(sender: String, title: String, body: String) extends Notification

case class SMS(caller: String, message: String) extends Notification

case class VoiceRecording(contactName: String, link: String) extends Notification
def showNotification(notification: Notification): String =
  notification match
    case Email(sender, title, _) =>
      s"You got an email from $sender with title: $title"
    case SMS(number, message) =>
      s"You got an SMS from $number! Message: $message"
    case VoiceRecording(name, link) =>
      s"You received a Voice Recording from $name! Click the link to hear it: $link"

val someSms = SMS("12345", "Are you there?")
val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123")

println(showNotification(someSms))  // prints You got an SMS from 12345! Message: Are you there?

println(showNotification(someVoiceRecording))  // prints You received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123

Email(sender, title, _) : 내부 요소들이 바로 매칭이 된다.

→ 매칭 시에 _ 로 인자를 선언해주면 무시할 수 있게 된다.

pattern guards