이번 포스팅에선 data class가 애플리케이션 성능에 미치는 영향에 대해 알아보겠다.
이번 포스팅을 하게 된 이유?
data class를 dto에 무의식적으로 붙여서 쓰고 있다가 문득 data class가 성능에 문제를 주진 않을까? 하는 생각에 정리하게 됐다.
data class란?
이전 포스팅에 정리한 Kotlin 공식 문서 번역 - 클래스, 데이터 클래스를 보고오자.
그렇다 생성자에 있는 프로퍼티로 아래 5개 메소드를 자동으로 만들어주는 클래스다.
- equals(): 동등 비교
- hashCode(): 해쉬 코드 생성
- toString(): 프로퍼티 출력
- copy(): 클래스 딥 카피
- componentN(): 구조 분해 지원
data class가 어플리케이션 성능에 영향을 미칠까?
내가 만든 프로젝트에선 data class가 자동으로 만들어 주는 메소드 중 그나마 toString()은 로그를 찍느라 자주 사용했다. 나머지는 거의 사용하지 않았다.
궁금해서 구글링을 해보던 중 나와 같은 생각을 한 사람이 있었다.
위 질문의 답변을 보면 data class가 만든 메소드들 때문에 어플리케이션의 사이즈만 늘어나고 성능엔 문제는 없다고 한다.
생각해보면 당연했다.
결론: 코드만 늘어날 뿐 그 코드를 자동으로 어디선가 사용하지 않기 때문에 어플리케이션 성능에 문제를 주지 않는 게 당연하다.
data class가 어플리케이션 사이즈에 미치는 영향
성능에 문제가 없다는 걸 알고 좀 더 구글링을 하다가 data class가 어플리케이션 사이즈에 어떤 영향을 주는지 정리한 글을 발견했다.
위 글을 요약해보자면
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를 쓰는 건 지양하는 게 좋겠다.
'Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin 공식 문서 번역 - 코루틴 가이드 (Coroutines guide) (1) | 2023.10.01 |
---|---|
[Kotlin] Kotlin 공식 문서 번역 - 시퀀스 (Sequence) (73) | 2023.09.26 |
[Kotlin] Kotlin 공식 문서 번역 - 역호환성 (Backward compatibility) (0) | 2023.08.26 |
[Kotlin] Kotlin 공식 문서 번역 - 데이터 클래스 (Data classes) (0) | 2023.08.26 |
[Kotlin] Kotlin 공식 문서 번역 - 클래스 (Classes) (0) | 2023.08.26 |
댓글