[kotlin] data, enum, object 클래스의 각 용도와 강점

kotlin에 있는 data, enum, object는 언뜻보면 매우 닮았다. 그 차이를 잘 모르겠음.

근데 똑같고 비슷할거면 굳이 세 개의 특별한 클래스로 나누지 않았겠지?
그 차이를 알아보자...


1. data class

  • data를 '가지고 있기' 위해서 사용한다.
  • 따라서 toString(), equals(), hashCode(), copy() 같은 함수를 자동으로 제공한다.
  • [Use case] data model이나 DTO를 사용하고 싶을 때
data class User(val id: Int, val name: String)

val user1 = User(1, "Alice")
val user2 = user1.copy(name = "Bob")  // Easy to clone with slight changes

2. enum class

  • 상수 집합이 있을 경우 사용한다
  • 각 상수는 properties와 함수를 가질 수 있다.
  • 상태값을 표현할 때 String이나 Int를 사용하는 것보다 enum을 사용하는 게 안전하다.
  • [Use case] 한정된 옵션이 필요한 경우게 사용한다. (status, type, direction)
enum class Status {
    SUCCESS,
    ERROR,
    LOADING
}

fun handleStatus(status: Status) {
    when (status) {
        Status.SUCCESS -> println("Success")
        Status.ERROR -> println("Error")
        Status.LOADING -> println("Loading")
    }
}

3. object class

  • 싱글톤이다 (인스턴스가 하나만 생성된다)
  • 함수, 상수, 업데이트된 상태를 가지고 있을 수 있다. (can hold)
  • 익명 객체나 객체 표현에 사용할 수 있다.
object Logger {
    fun log(message: String) {
        println("LOG: $message")
    }
}

Logger.log("App started")  // No need to create instance

 

  Enum을 사용 object를 사용
  상수 집합을 가지는 경우 사용한다 유틸이나 config를 위한 1개의 인스턴스만 필요한 경우 사용한다
type-safe states Enum이 좋음 object는 type safe하지 못함
behavior per constant Enum은 엔트리마다 개인 메서드를 가질 수 있음 Object has one shared behavior
shared state, config enum은 부적합 object는 싱글톤에 적합

class와 object의 fun사용