Kotlin/Native FAQ
프로그램을 어떻게 실행하나요?
최상위 함수(top-level function)인 fun main(args: Array<String>)을 정의하거나, 전달된 인자에 관심이 없다면 fun main()을 정의하세요. 이때 해당 함수가 패키지 안에 포함되지 않도록 주의하십시오. 또한, 컴파일러 스위치 -entry를 사용하여 Array<String>을 인자로 받거나 인자가 없으며 Unit을 반환하는 모든 함수를 진입점(entry point)으로 만들 수 있습니다.
Kotlin/Native의 메모리 관리 모델은 무엇인가요?
Kotlin/Native는 Java나 Swift에서 제공하는 것과 유사한 자동 메모리 관리 방식을 사용합니다.
Kotlin/Native 메모리 매니저에 대해 알아보기
공유 라이브러리(shared library)는 어떻게 만드나요?
컴파일러 옵션 -produce dynamic을 사용하거나 Gradle 빌드 파일에서 binaries.sharedLib()을 사용하세요:
kotlin {
iosArm64("mylib") {
binaries.sharedLib()
}
}이 옵션은 플랫폼별 공유 객체(Linux의 .so, macOS의 .dylib, Windows 타겟의 .dll)와 C 언어 헤더를 생성하며, C/C++ 코드에서 Kotlin/Native 프로그램의 모든 공개(public) API를 사용할 수 있게 해줍니다.
Kotlin/Native 동적 라이브러리 튜토리얼 완료하기
정적 라이브러리(static library)나 오브젝트 파일은 어떻게 만드나요?
컴파일러 옵션 -produce static을 사용하거나 Gradle 빌드 파일에서 binaries.staticLib()을 사용하세요:
kotlin {
iosArm64("mylib") {
binaries.staticLib()
}
}이 옵션은 플랫폼별 정적 객체(.a 라이브러리 형식)와 C 언어 헤더를 생성하며, C/C++ 코드에서 Kotlin/Native 프로그램의 모든 공개(public) API를 사용할 수 있게 해줍니다.
기업용 프록시 뒤에서 Kotlin/Native를 어떻게 실행하나요?
Kotlin/Native는 플랫폼별 툴체인을 다운로드해야 하므로, 컴파일러나 gradlew 인자로 -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx를 지정하거나 JAVA_OPTS 환경 변수를 통해 설정해야 합니다.
Kotlin 프레임워크에 커스텀 Objective-C 접두사/이름을 어떻게 지정하나요?
-module-name 컴파일러 옵션이나 그에 해당하는 Gradle DSL 문을 사용하세요.
kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += listOf("-module-name", "TheName")
}
}
}kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += ["-module-name", "TheName"]
}
}
}iOS 프레임워크의 이름을 어떻게 변경하나요?
iOS 프레임워크의 기본 이름은 <project name>.framework입니다. 커스텀 이름을 설정하려면 baseName 옵션을 사용하세요. 이 옵션은 모듈 이름도 함께 설정합니다.
kotlin {
iosArm64("myapp") {
binaries {
framework {
baseName = "TheName"
}
}
}
}Kotlin 프레임워크에서 비트코드(bitcode)를 어떻게 활성화하나요?
비트코드 임베딩은 Xcode 14에서 지원 중단(deprecated)되었으며, Xcode 15부터는 모든 Apple 타겟에서 제거되었습니다. Kotlin/Native 컴파일러는 Kotlin 2.0.20부터 비트코드 임베딩을 지원하지 않습니다.
이전 버전의 Xcode를 사용 중이지만 Kotlin 2.0.20 이상 버전으로 업그레이드하려는 경우, Xcode 프로젝트에서 비트코드 임베딩을 비활성화하십시오.
서로 다른 코루틴에서 객체를 안전하게 참조하려면 어떻게 해야 하나요?
Kotlin/Native의 여러 코루틴에서 객체에 안전하게 접근하거나 업데이트하려면 @Volatile 및 AtomicReference와 같은 동시성 안전 구성 요소(concurrency-safe constructs)를 사용하는 것이 좋습니다.
var 프로퍼티에 @Volatile 어노테이션을 사용하세요. 이렇게 하면 프로퍼티의 지원 필드(backing field)에 대한 모든 읽기 및 쓰기가 원자적(atomic)으로 수행됩니다. 또한, 쓰기 작업이 다른 스레드에 즉시 표시됩니다. 다른 스레드가 이 프로퍼티에 접근할 때 업데이트된 값뿐만 아니라 업데이트 이전에 발생한 변경 사항도 관찰할 수 있습니다.
또는 원자적 읽기 및 업데이트를 지원하는 AtomicReference를 사용하세요. Kotlin/Native에서 이는 휘발성(volatile) 변수를 감싸고 원자적 연산을 수행합니다. Kotlin은 또한 특정 데이터 유형에 맞춤화된 원자적 연산을 위한 일련의 타입을 제공합니다. AtomicInt, AtomicLong, AtomicBoolean, AtomicArray뿐만 아니라 AtomicIntArray 및 AtomicLongArray를 사용할 수 있습니다.
공유 가변 상태(shared mutable state) 접근에 대한 자세한 내용은 코루틴 문서를 참조하세요.
아직 출시되지 않은 버전의 Kotlin/Native로 프로젝트를 컴파일하려면 어떻게 해야 하나요?
먼저, 미리보기 버전(preview versions)을 사용해 보는 것을 고려해 보세요.
더 최신의 개발 버전이 필요한 경우, 소스 코드에서 Kotlin/Native를 빌드할 수 있습니다. Kotlin 저장소를 클론하고 이 단계들을 따르세요.
