케이스 클래스

케이스 클래스 (Case Classes)

케이스 클래스(case class)는 일반 클래스와 몇 가지 중요한 차이를 갖는 클래스예요. 불변 데이터를 모델링하기에 아주 좋고, 투어의 다음 단계에서 보게 될 패턴 매칭에서 특히 유용해요. 이 페이지에서는 케이스 클래스가 다르게 동작하는 지점을 하나씩 보여드릴게요.

출처: 공식 문서 — Case Classes

케이스 클래스 정의하기

가장 기본적인 케이스 클래스는 case class 키워드에 식별자와 파라미터 목록을 붙이면 돼요. 파라미터 목록은 비어 있어도 됩니다:

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

보통은 생략하지만 new Book()처럼 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

message1.senderval, 즉 불변이기 때문에 다시 할당할 수 없어요. 케이스 클래스 안에 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

message2message3는 서로 다른 객체를 가리키지만, 각 객체의 값이 동일하기 때문에 같다고 나와요.

복사 (Copying)

copy 메서드를 쓰면 케이스 클래스 인스턴스의 (얕은) 복사본을 쉽게 만들 수 있어요. 필요하면 생성자 인자도 함께 바꿀 수 있죠:

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("[email protected]", "[email protected]", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "[email protected]")
message5.sender  // [email protected]
message5.recipient // [email protected]
message5.body  // "Me zo o komz gant ma amezeg"

message4recipientmessage5sender로 쓰이고, body는 그대로 복사됐어요.

더 알아보기