코틀린 1.9.0 부터 추가된 data object 타입 알아보기

이영영
4 min readDec 18, 2023

--

UI를 개발하면서 주로 아래와 같은 형태의 ViewState 를 사용하고 있습니다.

sealed interface ViewState {
object Loading : ViewState
data class Success(val result: String) : ViewState
object Error : ViewState
}

그런데 이번에 kotlin 버전을 1.9.20으로 올리면서 object 에 린트가 뜨기 시작했습니다.

  • ‘sealed’ sub-object can be converted to ‘data object’

object -> data object 로 변경하면 되겠구나, 라는 짐작은 갔지만 어떤점이 달라진걸까 궁금해서 찾아봤습니다.

https://medium.com/@domen.lanisnik/data-objects-in-kotlin-1a549bfad657
https://github.com/Kotlin/KEEP/blob/data-objects/proposals/data-objects.md

이해하는 데 많은 도움이 되었던 게시글입니다. 해당 내용을 읽고 해석한 내용을 정리하는 것이라 정확하지 않을 수도 있습니다. ㅎㅎ 틀린 내용이 있으면 알려주시면 감사드리겠습니다. 🤓

data object

sealed class, sealed interface 에서 유용하게 사용할 수 있는 data object 타입 (프리뷰: kotlin 1.8.20 / 릴리즈: kotlin 1.9.0)

‘sealed’ 내부에서 object 와 data object 의 가장 큰 차이점은 toString() 했을 때 나오는 결괏값이었습니다. object 를 사용했을 때 각 타입에 대해 로그를 찍어봅니다.

  • data class 타입은 객체명과 데이터값을 간결하게 보여줍니다.
  • object 타입은 객체의 풀패키지명주소값까지 함께 보여줍니다.

object 는 data class 와 달리 toString() 에서 data class 처럼 객체명을 보여주는 구현이 안되어있기 때문에 모든 정보가 포함된 값들이 출력됩니다. 개발을 하면서 단순 로그를 찍을때에는, 특히 sealed 타입으로 감싸서 각 상태값을 관리할때에는 object 객체의 패키지명과 주소값은 유의미한 값이 아닐 수 있습니다.

문서에서도 object 출력 내용 중 주소값에 귀여운 이모티콘이 있는것을 볼 수 있습니다 (╯°□°)╯︵ ┻━┻

data class 처럼 객체명만 출력하려면 object 에 toString() 을 override 해서 직접 원하는 값을 출력하도록 구현을 해야합니다. 이는 불필요한 보일러플레이트 코드일 수 있습니다. 이 점을 data object 가 개선한것으로 보입니다.

data object 를 사용하면 선언한 객체명만 출력합니다.

sealed interface ViewState {
data object Loading : ViewState
data class Success(val result: String) : ViewState
data object Error : ViewState
}

data object 의 toString()

  • toString() function which returns the data object name.
  • object name 을 리턴합니다!

결론

sealed class, sealed interface 로 감싸고, 내부에 sub-object 로 object를 사용하고있다면 data object 로 변경해서 사용해보자!

--

--