본문 바로가기
Kotlin

[Kotlin] data class가 애플리케이션 성능에 미치는 영향

by 노력남자 2023. 8. 27.
반응형

이번 포스팅에선 data class가 애플리케이션 성능에 미치는 영향에 대해 알아보겠다.

 

이번 포스팅을 하게 된 이유?

 

data class를 dto에 무의식적으로 붙여서 쓰고 있다가 문득 data class가 성능에 문제를 주진 않을까? 하는 생각에 정리하게 됐다.

 

data class란?

 

이전 포스팅에 정리한 Kotlin 공식 문서 번역 - 클래스, 데이터 클래스를 보고오자.

 

그렇다 생성자에 있는 프로퍼티로 아래 5개 메소드를 자동으로 만들어주는 클래스다.

 

  • equals(): 동등 비교
  • hashCode(): 해쉬 코드 생성
  • toString(): 프로퍼티 출력
  • copy(): 클래스 딥 카피
  • componentN(): 구조 분해 지원

 

data class가 어플리케이션 성능에 영향을 미칠까?

 

내가 만든 프로젝트에선 data class가 자동으로 만들어 주는 메소드 중 그나마 toString()은 로그를 찍느라 자주 사용했다. 나머지는 거의 사용하지 않았다.

 

궁금해서 구글링을 해보던 중 나와 같은 생각을 한 사람이 있었다.

 

 

Kotlin data class overhead

According to the official doc, a Kotlin data class has the following generated functionalities: equals()/hashCode() pair toString() componentN() functions corresponding to the properties in their ...

stackoverflow.com

 

위 질문의 답변을 보면 data class가 만든 메소드들 때문에 어플리케이션의 사이즈만 늘어나고 성능엔 문제는 없다고 한다.

 

생각해보면 당연했다.

 

결론: 코드만 늘어날 뿐 그 코드를 자동으로 어디선가 사용하지 않기 때문에 어플리케이션 성능에 문제를 주지 않는 게 당연하다.

 

data class가 어플리케이션 사이즈에 미치는 영향

 

성능에 문제가 없다는 걸 알고 좀 더 구글링을 하다가 data class가 어플리케이션 사이즈에 어떤 영향을 주는지 정리한 글을 발견했다.

 

 

Data classes in Kotlin: how do they impact an application size

With the help of an experiment, I will try to understand the real cost of using a high number of data classes in an application.

medium.com

 

위 글을 요약해보자면

 

1. 컴파일러 플러그인을 사용하면 data class가 만들어 주는 메소드를 사용하지 않고 있다면 컴파일 단계에서 지울 수 있다.

 

2. 안드로이드 개발할 땐 앱 사이즈가 커질 수 있기 때문에 data class가 정말 필요한 경우에 사용하는 게 좋겠다.

 

3. data class를 사용하기 전에 아래와 같은 질문을 던져봐라.

 

- equals() 및 hashCode() 구현이 필요한가요? 필요하다면 데이터 클래스를 사용하는 것이 좋지만, toString()은 난독화되지 않습니다.

- 분해 대입을 사용해야 하나요? 이유만으로 데이터 클래스를 사용하는 것은 좋은 해결책이 아닙니다.

- toString() 구현이 필요한가요? 보통 toString() 구현에 의존하는 비즈니스 로직이 없을 것입니다. 때로는 IDE 도구를 사용하여 이 메서드를 수동으로 다시 생성할 수 있습니다.

- 다른 레이어로 데이터를 보내거나 구성 정보를 보유하기 위한 간단한 DTO가 필요한가요? 이전에 언급한 사항이 관련되지 않는다면 일반 클래스가 적합합니다.

 

위 글을 보니 data class가 class보다 사이즈가 큰 건 알겠는데 얼마나 큰 건지 정확하게 사이즈가 안 나와서 직접 컴파일해서 얼마나 차이가 나는지 알아봐야겠다.

 

data class와 class 파일 사이즈 비교

 

각 파일을 만든 후 kotlinc로 컴파일된 class 파일의 크기를 비교해봤다.

 

1. 프로퍼티 3개

 

data class Test(
    val prop1: Long,
    val prop2: String,
    val prop3: String
)

vs

class Test(
    val prop1: Long,
    val prop2: String,
    val prop3: String
)

 

data class: 2,955 Bytes

class: 1,313 Bytes

 

약 2.248배

 

2. 프로퍼티 10개

 

data class Test(
    val prop1: Long,
    val prop2: String,
    val prop3: String,
    val prop4: String,
    val prop5: String,
    val prop6: String,
    val prop7: String,
    val prop8: String,
    val prop9: String,
    val prop10: String
)

vs

class Test(
    val prop1: Long,
    val prop2: String,
    val prop3: String,
    val prop4: String,
    val prop5: String,
    val prop6: String,
    val prop7: String,
    val prop8: String,
    val prop9: String,
    val prop10: String
)

 

data class: 6,070 Bytes

class: 2,792 Bytes

 

약 2.17배

 

결론: 2가지 케이스만 비교해봤지만 파일 크기가 2배 이상 차이나는 걸 볼 수 있었다. 프로젝트 사이즈에 민감하면 data class를 정말 필요할 때만 사용하는 게 좋겠다.

 

결론

 

- 어플리케이션 성능에 문제를 주진 않는다.

- data class는 class보다 .class 파일이 2배 이상 크다.

- 프로젝트에 엄청난 영향을 주진 않지만 무분별하게 data class를 쓰는 건 지양하는 게 좋겠다.

반응형

댓글