IMCAT.DEV
로그인 가입
Kotlin 입문 객체지향

Kotlin 데이터 클래스

Kotlin 데이터 클래스 — 초급

데이터 클래스

1. 도입 (왜 배워야 하는가)

Kotlin의 데이터 클래스는 단순한 데이터 구조체를 정의하는 데 매우 유용합니다. 실무에서 데이터 클래스는 주로 API로부터 받아온 데이터를 저장하거나, 데이터베이스와의 상호작용을 처리하는 데 사용됩니다. 데이터 클래스는 코드의 가독성을 높이고, 데이터 처리의 효율성을 향상시키는 데 큰 도움을 줍니다.

데이터 클래스를 사용하지 않으면, 일반 클래스를 만들어야 하고, 이를 위해 equals(), hashCode(), toString() 메서드를 수동으로 오버라이드해야 합니다. 이 과정은 번거롭고, 개발자가 실수할 여지가 많습니다. 데이터 클래스를 활용하면 이러한 문제를 피할 수 있습니다.

2. 핵심 개념 설명

데이터 클래스는 주로 다음과 같은 특성을 가집니다:

  • 주 생성자: 데이터 클래스는 주 생성자를 통해 프로퍼티를 정의합니다. 이 프로퍼티들은 자동으로 getter, setter, equals(), hashCode(), toString() 메서드를 생성합니다.
  • Immutable (불변): 기본적으로 데이터 클래스의 프로퍼티는 val로 선언됩니다. 이는 데이터의 불변성을 보장하여 프로그램의 안정성을 높입니다.
  • 간결함: 데이터 클래스를 사용하면 코드가 간결해지고, 유지보수가 쉬워집니다.
  • 관련 용어 정리

    용어설명
    데이터 클래스데이터를 저장하기 위한 특별한 클래스
    주 생성자클래스의 인스턴스를 생성할 때 초기화할 프로퍼티를 정의하는 생성자
    불변성객체의 상태가 한번 설정되면 변경되지 않도록 하는 특성

    3. 기본 코드 예제

    가장 기본적인 데이터 클래스의 사용법은 다음과 같습니다.

    data class Person(val name: String, val age: Int)
    
    fun main() {
        val person = Person("Alice", 30)
        println(person)  // 출력: Person(name=Alice, age=30)
    }

    실행 결과

    Person(name=Alice, age=30)

    코드 한 줄씩 동작 설명

    1. data class Person(val name: String, val age: Int): Person이라는 데이터 클래스를 정의하고, 두 개의 프로퍼티(name, age)를 설정합니다.
    2. fun main(): 프로그램의 시작점인 main 함수를 정의합니다.
    3. val person = Person("Alice", 30): Person 클래스의 인스턴스를 생성하고 person 변수에 할당합니다.
    4. println(person): person 객체를 출력합니다. 이 때, 데이터 클래스에서 자동 생성된 toString() 메서드가 호출되어 객체의 상태를 문자열로 변환합니다.
    5. 4. 실전 활용 예제

      예제 1: 쇼핑몰 장바구니

      쇼핑몰 애플리케이션에서 장바구니에 담긴 상품을 표현하는 데이터 클래스를 만들어봅시다.

      data class CartItem(val productId: String, val quantity: Int)
      
      fun main() {
          val item1 = CartItem("P001", 2)
          val item2 = CartItem("P002", 1)
          println(item1)  // 출력: CartItem(productId=P001, quantity=2)
          println(item2)  // 출력: CartItem(productId=P002, quantity=1)
      }

      이 예제에서는 장바구니에 담긴 각 상품을 CartItem 데이터 클래스로 표현합니다.

      예제 2: 사용자 정보

      사용자 정보를 저장하기 위한 데이터 클래스를 사용할 수 있습니다.

      data class User(val username: String, val email: String)
      
      fun main() {
          val user = User("john_doe", "[email protected]")
          println(user)  // 출력: User(username=john_doe, [email protected])
      }

      이 예제에서는 사용자의 이름과 이메일을 저장하는 User 데이터 클래스를 정의합니다.

      5. 흔한 실수와 주의사항

      실수 1: 데이터 클래스의 기본 생성자에 var 사용

      data class Person(var name: String, var age: Int) // 잘못된 사용
    6. 데이터 클래스에서는 val을 사용하여 불변성을 유지하는 것이 좋습니다. var로 선언하면 데이터 클래스의 장점을 잃게 됩니다.
    7. 실수 2: toString() 메서드 오버라이드

      data class Person(val name: String, val age: Int) {
          override fun toString(): String {
              return "이름: $name, 나이: $age" // 불필요한 오버라이드
          }
      }
    8. 데이터 클래스는 자동으로 toString()을 생성하므로, 이를 오버라이드할 필요가 없습니다. 이는 불필요한 코드로, 유지보수성을 떨어뜨립니다.
    9. 6. 정리

    10. 데이터 클래스는 데이터를 간편하게 정의하고 처리할 수 있는 구조체입니다.
    11. 주 생성자를 사용하여 프로퍼티를 정의하고, 불변성을 유지하는 것이 중요합니다.
    12. 실무에서 데이터 클래스는 API 응답이나 데이터베이스의 레코드를 표현하는 데 유용하게 사용됩니다.
    13. 다음에 학습하면 좋은 주제로는 sealed class나 enum class가 있습니다. 이들은 데이터의 종류를 제한하고, 더욱 안전한 코드를 작성하는 데 도움을 줍니다.