unapply 메소드가 있는 오브젝트이다. apply메소드가 오브젝트를 생성하고 인자를 가지는 생성자인 반해, unapply는 오브젝트를 받아서 인자를 역으로 뽑아낸다. 패턴매칭과 partial function에 사용된다.

import scala.util.Random

object CustomerID:

  def apply(name: String) = s"$name--${Random.nextLong()}"

  def unapply(customerID: String): Option[String] =
    val stringArray: Array[String] = customerID.split("--")
    if stringArray.tail.nonEmpty then Some(stringArray.head) else None

val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908
customer1ID match
  case CustomerID(name) => println(name)  // prints Sukyoung
  case _ => println("Could not extract a CustomerID")

apply메소드가 이름으로부터 customerID를 만들어낸다.

unapply는 이름을 다시 역연산해서 추출한다.

When we call CustomerID("Sukyoung") , this is shorthand syntax for calling CustomerID.apply("Sukyoung")

When we call case CustomerID(name) => println(name) , we’re calling the unapply method with CustomerID.unapply(customer1ID)

패턴을 써서 새로운 변수를 만들어낼 수 있으므로 추출은 어떤 값을 초기화할때도 쓸 수 있다.

val customer2ID = CustomerID("Nico")
val CustomerID(name) = customer2ID
println(name)  // prints Nico

CustomerID("Nico") → 여기서 만들어낸 값에서 이름을 추출해서 name에 할당해준다.

This is equivalent to val name = CustomerID.unapply(customer2ID).get.

**val** **CustomerID**(name2) = "--asdfasdfasdf"

If there is no match, a scala.MatchError is thrown: