학습
Scala 케이스 클래스 (Case Classes)
Scala 케이스 클래스 (Case Classes) — 중급
케이스 클래스 (Case Classes)
1. 도입 (왜 배워야 하는가)
Scala에서 케이스 클래스는 불변 데이터 구조를 쉽게 만들고 사용할 수 있는 강력한 도구입니다. 실무에서는 데이터 전송 객체(DTO)나 도메인 모델을 정의할 때 케이스 클래스를 자주 사용하게 됩니다. 예를 들어, API로부터 받은 JSON 데이터를 매핑할 때 케이스 클래스를 사용하면 코드의 가독성을 높이고, 오류를 줄일 수 있습니다.
케이스 클래스를 잘 모르고 사용한다면, 일반 클래스처럼 복잡하게 데이터를 관리하게 되어 코드가 비효율적이고 어렵게 될 수 있습니다. 특히, 데이터의 비교나 복사, 패턴 매칭 등에서 많은 불편함이 발생할 수 있습니다.
2. 핵심 개념 설명
케이스 클래스는 Scala에서 제공하는 특별한 형태의 클래스입니다. 주요 특징은 다음과 같습니다:
- 불변성: 기본적으로 생성된 객체는 변경할 수 없습니다.
- 자동으로 생성되는 메소드:
equals,hashCode,toString메소드가 자동으로 정의됩니다. - 패턴 매칭 지원: 케이스 클래스를 사용하면 패턴 매칭을 쉽게 활용할 수 있습니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 불변성 (Immutability) | 객체의 상태가 생성 이후 변경되지 않음 |
| 패턴 매칭 (Pattern Matching) | 주어진 값에 따라 코드를 분기하는 기능 |
| 데이터 클래스 (Data Class) | 데이터를 저장하기 위한 클래스 |
3. 기본 코드 예제
가장 기본적인 케이스 클래스의 사용법은 다음과 같습니다:
case class Person(name: String, age: Int)
val person1 = Person("Alice", 30)
val person2 = Person("Bob", 25)
// person1과 person2의 정보를 출력
println(person1) // Person(Alice,30)
println(person2) // Person(Bob,25)
실행 결과
Person(Alice,30)
Person(Bob,25)
코드 한 줄씩 동작 설명
case class Person(name: String, age: Int): Person이라는 이름의 케이스 클래스를 정의하고, 두 개의 필드 name과 age를 설정합니다.val person1 = Person("Alice", 30): Person 클래스로 person1 객체를 생성합니다. 이 객체는 불변입니다.println(person1): person1의 정보를 문자열 형태로 출력합니다.4. 실전 활용 예제
예제 1: 쇼핑몰의 장바구니 구현
쇼핑몰에서 장바구니를 구현할 때 각 상품을 나타내기 위해 케이스 클래스를 사용할 수 있습니다.
case class Item(name: String, price: Double)
case class Cart(items: List[Item]) {
def totalPrice: Double = items.map(_.price).sum
}
val cart = Cart(List(Item("Laptop", 1000), Item("Mouse", 50)))
println(cart.totalPrice) // 1050.0
예제 2: API 응답 모델
API를 통해 사용자 정보를 받을 때 케이스 클래스를 활용할 수 있습니다.
case class User(id: Int, username: String, email: String)
val userResponse = User(1, "john_doe", "[email protected]")
println(userResponse) // User(1,john_doe,[email protected])
5. 흔한 실수와 주의사항
실수 1: mutable 변수 사용
case class Point(var x: Int, var y: Int) // 잘못된 예
case class Point(x: Int, y: Int) // 올바른 예
실수 2: 패턴 매칭에서 기본 클래스 사용
val p: Any = Point(1, 2)
p match {
case Point(x, y) => println(s"x: $x, y: $y")
case _ => println("Unknown")
}
Any 타입으로 선언하면 패턴 매칭이 제대로 작동하지 않을 수 있습니다.val p: Point = Point(1, 2) // 올바른 예