일반적인 클래스와 비슷하나 몇가지 차이점이 임ㅆ다. 불변 데이터를 모델링할때 유용하다, 패턴매칭과도 유용하다

Defining a case class

최소한의 선언 방법은 case class 와 선언자를 활용하고 인자리스트를 활용

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

→ 키워드 new가 쓰이지 않는다.

apply 메소드가 기본적으로 있고 오브젝트 생성을 담당하고 있기 때문이다.

파라미터들이 기본적으로 public val이 된다. 그리고 불변하다

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("[email protected]", "[email protected]", "Ça va ?")

println(message1.sender)  // prints [email protected]
message1.sender = "[email protected]"  // this line does not compile

var로 정의해서 가변하게 쓸 수있으나 권장하지 않는다.

comparison

참조가 아니라 구조에 대해서 비교가 된다. 인스턴스가 있는 메모리 공간이 아니라 각 값들을 자동으로 비교해 준다.

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("[email protected]", "[email protected]", "Com va?")
val message3 = Message("[email protected]", "[email protected]", "Com va?")
val messagesAreTheSame = message2 == message3  // true

copying

shallow 카피를 쉽게 할 수 있다.