IMCAT.DEV
로그인 가입
Scala 중급 객체지향

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) // 잘못된 예
  • 잘못된 코드: mutable 변수를 사용하면 불변성을 유지할 수 없습니다.
  • 올바른 코드:
  • 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) // 올바른 예

    6. 정리

  • 케이스 클래스는 불변 데이터 구조를 쉽게 만들 수 있는 유용한 도구입니다.
  • 자동으로 생성되는 메소드 덕분에 코드의 가독성이 높아집니다.
  • 패턴 매칭을 통해 코드의 분기를 간편하게 처리할 수 있습니다.
  • 다음 학습할 주제로는 컬렉션이나 패턴 매칭의 고급 사용법을 추천합니다.