이번 글은 최근 Java -> Kotlin 변환과
Java 클래스에서 Kotlin 클래스를 사용하면서 겪은 이슈를 공유해본다.
문제 상황 설명
먼저 Java 클래스를 Kotlin 클래스로 변경했다.
이 때 특정 변수는 자료형을 변경하면서까지 리팩토링을 진행했다.
그리고 다시 변경한 Kotlin 클래스를 Java 클래스에서 사용하는 부분이 필요했다.
(아래처럼 말이다)
class SomeData {
var a: UInt = 0
var b: Int = 0
}
public class User {
public void someMethod() {
SomeData someData = new SomeData();
someData.getB();
someData.getA();
}
}
Kotlin 변환을 마친 클래스를 마구 호출하다보니 갑자기 마주한 에러..
그는 실행 전에 찾아오지 않고 컴파일 타임에 찾아왔다..
Cannot find symbol get~()
Cannot find symbol set~()
그래서 Invalidate caches, clean & rebuild까지 몇번을 해봤는지도 모르겠다.
문제 발생 원인은?
다들 코틀린 공부할 때 들어봤을만한 말이 있다.
코틀린은 자바와 완벽히 호환된다.
이러면 안되는 거잖아.. 라는 생각이 들었다.
여기서 간과한 부분은 내가 변경한 Kotlin 클래스에서 UInt를 사용하는 변수가 있었다.
하지만 Java 클래스에서 getter, setter를 호출하면 자바에서 해당 getter, setter를 찾지 못했다.
(위 코드블럭을 예시로 들자면 getA()에서 에러가 발생한다)
Java에는 UInt 자료형이 없기 때문이다.
해결은?
그래서 getter를 override하여 Int형을 리턴하도록 변경해주고,
setter를 override하여 Int형을 받을 수 있도록 변경해주면 정상적으로 실행이 가능했다.
class SomeData {
var a: UInt
fun getA(): Int {
return a.toInt()
}
fun setA(input: Int) {
a = input.toUInt()
}
}
이번 경험으로 인해 리팩토링 시 신경써야할 점이 하나 추가되었다.
Kotlin 변환 시 Java에 없는 자료형을 다룰 경우 별도 처리가 필요하다는 것이다.
'Language > Kotlin' 카테고리의 다른 글
Coroutines 여러 개로 연산 속도 높이기 (1) | 2024.11.22 |
---|---|
CoroutineScope와 CoroutineContext 되짚어보기 (0) | 2024.09.21 |
withContext로 스레드 전환하기 (0) | 2024.09.18 |
Coroutines Dispatcher 알아보기 (2) | 2024.09.13 |
CoroutineContext와 CoroutineScope 알아보기 (1) | 2024.09.04 |