kotlin 사용시 주의할 점 (feat.생성자)

겔로그·2024년 5월 12일
0

최근 신규 프로젝트를 진행하며 Kotlin, OpenAPI Specification3를 도입해 사용하고 있다.

이 과정에서 기본적인 것이지만 놓치기 쉬운 주의사항에 대해 알아가보고자 한다.

자세한 내용은 Kotlin Docs - Classes 를 참고하면 좋다.

class vs data class

기본적으로 Kotlin은 class와 data class를 구분하여 정의할 수 있다. IDE를 활용하여 이 두가지의 클래스를 Byte Code로 변환한 후 java 코드로 디컴파일할 경우 두 클래스에 큰 차이점이 있다는 것을 알 수 있다.

요약하자면, class는 kotlin에 정의한 내용에서 기본적으로 생성자까지 생성해주고 data class toString, copy 등 다양한 보일러 플레이트를 자동으로 생성해준다.

무엇을 주의해야 하는가?

JVM에서는 모든 파라미터 인자가 default value를 가지고 있을경우 자체적으로 빈 생성자를 하나 추가로 생성한다. 해당 이유는 Jackson이나 JPA에서 인스턴스를 빈 생성자로 더 쉽게 만들기 위함이라고 한다.

왜 주의해야 하는가?(feat. val)

이는 val 연산자의 특성과 관련있다. val의 경우 setter가 없이 getter만 생성되는 변경 불가능한 immutable 변수이다.

immutable한 특성으로 인해 setter를 사용하지 못한다.

문제는 kotlin에서 다양한 java 라이브러리를 사용하는데 이 라이브러리들은 디컴파일된 자바 클래스로 로직을 수행한다는 점에서 발생된다. 빈 생성자를 사용하는 순간 val 변수는 특정 값으로 초기화되며 이 값을 변경하기 위해선 새로운 객체로 생성해야만 한다.

이를 방지하려면?

답은 간단하다. 모든 값을 초기화하지 않도록 하거나 변경 가능성이 있는 객체들은 var 변수로 할당하는 것이다.

다만.. OpenAPI Specification 또는 mapstruct를 kotlin과 함께 사용한다면 그때부터는 약간의 눈물이 흐를 것으로 예상되는데.. 이는 다음 글에서 공유하겠다.

profile
Gelog 나쁜 것만 드려요~

0개의 댓글