케이스 클래스
케이스 클래스 (Case Classes)
케이스 클래스(case class)는 일반 클래스와 몇 가지 중요한 차이를 갖는 클래스예요. 불변 데이터를 모델링하기에 아주 좋고, 투어의 다음 단계에서 보게 될 패턴 매칭에서 특히 유용해요. 이 페이지에서는 케이스 클래스가 다르게 동작하는 지점을 하나씩 보여드릴게요.
케이스 클래스 정의하기
가장 기본적인 케이스 클래스는 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.sender는 val, 즉 불변이기 때문에 다시 할당할 수 없어요. 케이스 클래스 안에 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
message2와 message3는 서로 다른 객체를 가리키지만, 각 객체의 값이 동일하기 때문에 같다고 나와요.
복사 (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"
message4의 recipient가 message5의 sender로 쓰이고, body는 그대로 복사됐어요.
더 알아보기
- 패턴 매칭 (Pattern Matching) — 케이스 클래스와 함께 쓰이는 핵심 기능
- 클래스 (Classes) — 일반 클래스와의 차이를 다시 확인
- 싱글턴 객체 (Singleton Objects) —
apply등이 정의되는 곳