-
Kotlin과 Java의 컴파일 순서Kotlin/Kotlin 2023. 11. 11. 00:01728x90
개요
문득 나는 Kotlin의 컴파일과정을 잘 이해하고 있는가?라는 생각이 떠올라서 코틀린이 컴파일 되는 과정에 대해 이해해보려고 합니다.
"누군가 나에게 묻는다면 이해하기 쉽게 대답할 수 있는가.."
Kotlin과 JVM
Kotlin은 JVM위에서 동작하기 때문에 Java의 컴파일 과정과 유사합니다.
- *.kt 파일, *.java 파일을 코틀린 컴파일러가 *.class 파일로 변환한다.
하지만 Java와 Kotlin 코드가 동시에 활용되는 경우에는 어떻게 될까?
- 코틀린 파일이 코틀린 컴파일러에 의해 .class로 변환된다. (코틀린 코드가 참조하는 Java 코드가 함께 로딩된다)
- Java 컴파일러가 Java 코드를 컴파일하여 .class 파일을 생성하고, Kotlin이 이미 컴파일한 .class 파일의 경로를 클래스 패스에 추가하여 컴파일한다.
Kotlin이 먼저 컴파일되고 Java가 컴파일되고 애너테이션 프로세싱이 일어나는 과정이 중요하다!
보통 우리는 Lombok을 많이 사용한다.
애노테이션 프로세싱은 코틀린 컴파일 이후에 동작하기 때문에 롬복에서 생성된 자바 코드는 코틀린 코드에서 접근할 수 없다.
만약 자바 코드가 먼저 컴파일되도록 빌드 순서를 조정한다면 롬복 문제를 해결할 순 있지만, 반대로 자바 코드에서 코틀린 코드를 호출할 수 없습니다.
- Kotlin 1.5.2부터는 롬복 컴파일러 플러그인이 실험적으로 추가되었습니다.
- 롬복의 Delombok을 활용하여 롬복을 걷어내는 방법을 활용할 수도 있습니다.
애너테이션 프로세싱이란?
소스코드나 컴파일된 바이트 코드에 추가된 애너테이션을 검사하고 처리하기 위한 메커니즘입니다.
예를 들어 컴파일시점에 롬복의 @Data 등의 애노테이션을 발견하고 getter, setter, eqauls, hashcode와 같은 메서드들을 생성해 냅니다.
이때 Kotlin 코드에서는 Lombok이 생성한 Java 코드에 대해 유효한지 확인할 수 없어 컴파일 에러가 발생할 수 있습니다.
참고자료
https://www.youtube.com/watch?v=ewBri47JWII
https://d2.naver.com/helloworld/6685007
'Kotlin > Kotlin' 카테고리의 다른 글
kotlin operator fun invoke (0) 2024.02.19 Kotlin Synchonized와 MultiThread (0) 2023.11.22 [Kotlin] 상태패턴으로 배송상태를 변경해보자 (0) 2023.08.29 [Kotlin] Result란? (0) 2022.12.04 [Kotlin] 연산자 오버로딩 사용 예시 (0) 2022.11.25