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: