Kotlin/Native FAQ
Kotlin/Native FAQ
Kotlin/Native를 쓰다가 자주 나오는 질문들을 모아 정리했어요.
본문
내 프로그램은 어떻게 실행하나요?
최상위 함수 fun main(args: Array<String>)를 정의하거나, 전달된 인자에 관심이 없다면 그냥 fun main()을 정의하면 됩니다. 단, 이 함수가 패키지 안에 있으면 안 돼요. 또한 컴파일러 스위치 -entry를 쓰면 Array<String>을 받는 함수 혹은 인자가 없는 함수 중 Unit을 반환하는 어떤 함수든 진입점으로 만들 수 있습니다.
Kotlin/Native 메모리 관리 모델은 무엇인가요?
Kotlin/Native는 Java나 Swift가 제공하는 것과 유사한 자동 메모리 관리 방식을 사용합니다.
Kotlin/Native 메모리 관리자에 대해 알아보세요.
공유 라이브러리는 어떻게 만드나요?
-produce dynamic 컴파일러 옵션을 쓰거나 Gradle 빌드 파일에서 binaries.sharedLib()를 사용하면 됩니다.
그러면 플랫폼별 공유 객체(Linux에서 .so, macOS에서 .dylib, Windows 타깃에서 .dll)와 C 언어 헤더가 생성되어, C/C++ 코드에서 Kotlin/Native 프로그램에 있는 모든 공개 API를 사용할 수 있게 됩니다.
이 Kotlin/Native 동적 라이브러리 튜토리얼을 완료해 보세요.
정적 라이브러리나 오브젝트 파일은 어떻게 만드나요?
-produce static 컴파일러 옵션을 쓰거나 Gradle 빌드 파일에서 binaries.staticLib()을 사용하면 됩니다.
그러면 플랫폼별 정적 객체(.a 라이브러리 형식)와 C 언어 헤더가 생성되어, C/C++ 코드에서 Kotlin/Native 프로그램에 있는 모든 공개 API를 사용할 수 있게 됩니다.
기업 프록시 뒤에서 Kotlin/Native를 어떻게 실행하나요?
Kotlin/Native는 플랫폼별 툴체인을 다운로드해야 하므로, 컴파일러 또는 gradlew 인자로 -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx를 지정하거나 JAVA_OPTS 환경 변수로 설정해야 합니다.
Kotlin 프레임워크의 커스텀 Objective-C 접두사/이름은 어떻게 지정하나요?
-module-name 컴파일러 옵션 또는 그에 대응하는 Gradle DSL 문을 사용하세요.
iOS 프레임워크 이름은 어떻게 바꾸나요?
iOS 프레임워크의 기본 이름은 <project name>.framework예요. 커스텀 이름을 설정하려면 baseName 옵션을 쓰세요. 이 옵션은 모듈 이름도 함께 설정합니다.
Kotlin 프레임워크의 비트코드는 어떻게 활성화하나요?
비트코드 임베딩(Bitcode embedding)은 Xcode 14에서 폐기(deprecated)되었고 Xcode 15에서 모든 Apple 타깃에 대해 제거되었어요. Kotlin/Native 컴파일러는 Kotlin 2.0.20부터 비트코드 임베딩을 지원하지 않습니다.
이전 버전의 Xcode를 쓰면서 Kotlin 2.0.20 이상으로 업그레이드하려면 Xcode 프로젝트에서 비트코드 임베딩을 비활성화하세요.
iOS에서 더 나은 크래시 리포트를 얻으려면 어떻게 해야 하나요?
처리되지 않은 Kotlin 예외가 iOS 코드에 도달하면, 크래시 리포트 도구가 예외가 던져진 실제 코드 줄 대신 내부 Kotlin/Native 문제라고 막연한 리포트를 보여줄 수 있어요. 이는 크래시가 기록되는 시점에 원래 Kotlin 스택 트레이스가 유실되기 때문입니다.
이 문제는 NSExceptionKt 같은 서드파티 솔루션으로 우회할 수 있어요. 이 라이브러리는 잡히지 않은 Kotlin 예외를 NSException 인스턴스로 변환해서 크래시 리포트 도구가 올바른 스택 트레이스를 잡아내게 합니다. 인기 있는 크래시 리포트 도구용 전용 통합도 제공합니다:
서로 다른 코루틴에서 객체를 안전하게 참조하려면 어떻게 해야 하나요?
Kotlin/Native에서 여러 코루틴에 걸쳐 객체에 안전하게 접근하거나 업데이트하려면 @Volatile과 AtomicReference 같은 동시성 안전(concurrency-safe) 구조를 고려해 보세요.
@Volatile로 var 프로퍼티에 주석을 달 수 있어요. 그러면 프로퍼티의 백킹 필드에 대한 모든 읽기·쓰기가 원자적(atomic)이 됩니다. 게다가 쓰기는 다른 스레드에 즉시 보이게 되요. 다른 스레드가 이 프로퍼티에 접근하면 업데이트된 값뿐 아니라 업데이트 이전에 일어난 변경 사항까지 모두 관찰합니다.
혹은 원자적 읽기와 업데이트를 지원하는 AtomicReference를 사용하세요. Kotlin/Native에서 이는 휘발성(volatile) 변수를 감싸서 원자적 연산을 수행합니다. Kotlin은 또한 특정 데이터 타입에 맞춘 원자적 연산용 타입 세트도 제공해요. AtomicInt, AtomicLong, AtomicBoolean, AtomicArray뿐 아니라 AtomicIntArray와 AtomicLongArray도 사용할 수 있습니다.
공유 변경 가능 상태에 대한 접근에 관한 자세한 내용은 Coroutines 문서를 참고하세요.
미출시 버전의 Kotlin/Native로 내 프로젝트를 컴파일하려면 어떻게 해야 하나요?
먼저 미리보기 버전을 시도해 보시길 권합니다. (EAP 상세 설명)
더 최신 개발 버전이 필요하다면 Kotlin/Native를 소스 코드에서 직접 빌드할 수 있어요: Kotlin 리포지토리를 클론하고 이 단계를 따라 하세요.