Kotlin/Native — 네이티브 코드 컴파일러 개요 및 특징

저자: IT Sectr 게시일: 2026-06-05 읽는 시간: 8 분

Kotlin/Native는 Kotlin 코드를 가상 머신 없이 직접 네이티브 머신 코드로 변환하는 컴파일러입니다. JVM 버전과 달리 Kotlin/Native는 LLVM 백엔드를 사용하여 iOS, Android NDK, macOS, Windows, Linux 및 WebAssembly용 실행 파일을 생성합니다. 이 기술은 Kotlin Multiplatform의 기반이며 JVM을 사용할 수 없는 플랫폼에서 공유 코드 실행을 가능하게 합니다. JetBrains, 2025에 따르면 Kotlin/Native는 13개의 대상 플랫폼을 지원하며 KMM 프로젝트에서 최대 90%의 코드를 재사용할 수 있습니다.

핵심 사항

  • Kotlin/Native는 JVM을 사용하지 않고 Kotlin 코드를 네이티브 머신 코드로 변환하는 컴파일러입니다.
  • LLVM은 각 대상 플랫폼에 대한 머신 코드를 생성하는 컴파일러 백엔드입니다.
  • KMM — Kotlin Multiplatform Mobile은 iOS 기기에서 공유 코드를 실행하기 위해 Kotlin/Native를 사용합니다.
  • Memory Manager는 스레드를 중단하지 않고 참조 카운팅을 기반으로 작동하는 자동 가비지 컬렉터입니다.
  • Interop은 네이티브 Objective-C, Swift 및 C 라이브러리와의 양방향 상호 작용 메커니즘입니다.

Kotlin/Native란?

Kotlin/Native는 JetBrains가 개발한 Kotlin 코드를 네이티브 머신 코드로 컴파일하는 기술입니다. Kotlin/JVM과의 주요 차이점은 가상 머신이 필요 없다는 점입니다. 결과 실행 파일에는 머신 코드와 최소한의 런타임만 포함됩니다. 이를 통해 iPhone, Apple Watch 및 임베디드 시스템을 포함하여 JVM이 지원되지 않는 장치 및 시스템에서 Kotlin 애플리케이션을 실행할 수 있습니다.

Kotlin/Native의 역사는 2017년 Kotlin의 메인 브랜치에 통합된 실험적인 컴파일러 프로젝트에서 시작되었습니다. 2019년 KotlinConf에서 대상 플랫폼으로 iOS 지원이 발표되었으며, 이는 모바일 개발의 전환점이 되었습니다. Kotlin 1.9.20부터 Kotlin/Native 컴파일러는 안정성을 달성했으며 기본적으로 Kotlin Multiplatform에 포함되어 있습니다.

Kotlin/Native의 주요 특징은 공통 중간 표현 IR을 사용한다는 점입니다. 이는 각 플랫폼에 대해 별도로 머신 코드로 컴파일됩니다. 이를 통해 모든 Kotlin 백엔드(JVM, JS 및 Native)에 대한 통합 컴파일 프론트엔드를 제공합니다.

Kotlin/Native 컴파일러 작동 방식

Kotlin/Native의 컴파일은 여러 변환 단계를 거칩니다. Kotlin 소스 코드는 먼저 내부 표현으로 변환된 다음 최적화되어 LLVM 백엔드로 전달되어 머신 코드를 생성합니다. 최종 단계는 런타임 라이브러리와 링크하고 실행 파일 또는 동적 라이브러리를 생성하는 것입니다.

아키텍처에는 프론트엔드(파싱 및 타입 검사), IR 생성기(중간 표현 구축) 및 LLVM 백엔드(머신 코드 생성)의 세 가지 주요 구성 요소가 포함됩니다. 이 방식은 C++ 및 Rust용 Clang 컴파일러에서 사용되는 접근 방식과 유사합니다.

kotlin
// 명령줄을 통한 Kotlin/Native 컴파일
kotlinc-native hello.kt -o hello -opt

// Kotlin Multiplatform을 통한 iOS arm64 빌드
./gradlew :shared:linkDebugFrameworkIosArm64

메모리 관리를 위해 Kotlin/Native는 사이클 감지기가 있는 참조 카운팅을 기반으로 하는 자체 Memory Manager를 사용합니다. Kotlin 1.7.20부터 새로운 메모리 관리자는 기본적으로 작동하며 @ThreadLocal 또는 @SharedImmutable 어노테이션이 필요하지 않습니다. 가비지 컬렉터는 스레드를 중단하지 않고 작동하며, 이는 메인 스레드가 장기간 차단될 때 시스템이 애플리케이션을 강제 종료할 수 있는 iOS에서 중요합니다.

Kotlin/Native 컴파일 단계

컴파일 프로세스는 파싱(소스 코드 분석), 의미 분석(타입 검사 및 이름 확인), IR 생성(중간 표현 구축), 최적화(단순화 및 데드 코드 제거) 및 LLVM을 통한 코드 생성의 5단계로 나뉩니다. 각 단계는 서로 다른 모듈에 대해 병렬로 실행될 수 있어 대규모 프로젝트의 빌드 속도를 높입니다.

단계소요 시간결과
파싱약 10%소스 코드의 AST 트리
의미 분석약 20%타입 지정된 AST
IR 생성약 15%Kotlin IR (중간 표현)
최적화약 25%최적화된 IR
LLVM 코드 생성약 30%머신 코드 + 실행 파일

지원되는 Kotlin/Native 플랫폼

Kotlin/Native는 카테고리로 구분된 13개의 대상 플랫폼을 지원합니다. 모바일 개발을 위해 iOS(arm64), Android(arm32, arm64, x86_64)watchOS를 사용할 수 있습니다. 데스크톱 플랫폼에는 macOS(x64, arm64), Windows(mingw x64) 및 Linux(x64, arm64, arm32)가 포함됩니다. 서버 및 임베디드 개발을 위해 WebAssembly 및 OS 없는 LLVM의 Kotlin/Native(독립 실행형)를 사용할 수 있습니다. 각 플랫폼에는 출력으로 별도의 프레임워크 또는 라이브러리가 필요합니다.

모바일 개발 플랫폼

iOS의 경우 Kotlin/Native는 Xcode 프로젝트에 연결할 수 있는 유니버설 프레임워크(.framework)를 생성합니다. Android NDK의 경우 JNI를 통해 호출할 수 있는 네이티브 .so 라이브러리가 생성됩니다. watchOS는 Kotlin 1.6.0부터, tvOS는 버전 1.7.0부터 지원됩니다. 각 아키텍처는 별도의 빌드가 필요하지만 Kotlin Multiplatform은 Gradle 플러그인을 통해 이 프로세스를 자동화합니다.

데스크톱 및 서버 플랫폼

macOSLinux는 Compose Multiplatform 프레임워크를 사용하여 Kotlin에서 네이티브 데스크톱 애플리케이션을 개발하는 데 사용됩니다. Windows(MinGW)는 Kotlin 1.3.70부터 지원되며 JVM을 설치하지 않고 Windows 애플리케이션을 만들 수 있습니다. 서버 개발의 경우 Kotlin/Native를 JVM을 사용할 수 없는 환경(예: scratch 또는 Alpine 기반 최소 이미지의 Docker 컨테이너)에서 사용할 수 있습니다.

카테고리플랫폼아키텍처
모바일iOSarm64, 시뮬레이터(x64, arm64)
모바일Android NDKarm32, arm64, x86, x86_64
웨어러블watchOSarm64, 시뮬레이터(x64)
데스크톱macOSx64, arm64
데스크톱Windowsmingw x64
데스크톱Linuxx64, arm64, arm32

iOS 개발을 위한 Kotlin/Native

iOS는 KMM 맥락에서 Kotlin/Native의 주요 대상 플랫폼입니다. 컴파일러는 모든 공유 코드를 포함하는 iOS 프레임워크를 생성하며, 이는 Xcode 프로젝트에 연결됩니다. 프레임워크는 정적 및 동적 링크를 모두 지원합니다. Kotlin/Native는 Kotlin 클래스 및 함수에 대한 Objective-C 래퍼를 생성하여 Swift 및 Objective-C 코드와의 직접적인 통합을 제공합니다.

iOS와의 통합은 생성된 프레임워크를 연결하기 위해 Xcode를 구성해야 합니다. Kotlin Multiplatform은 Xcode Build Phases에서 호출되는 embedAndSignAppleFrameworkForXcode 작업을 사용하여 이 프로세스를 자동화합니다. 디버깅을 위해 Kotlin/Native는 iOS 시뮬레이터에서 애플리케이션을 실행할 때 공유 모듈 코드의 중단점을 지원합니다.

kotlin
// iOS 프레임워크로 컴파일된 Kotlin 코드
package com.itsectr.shared

class GreetingProvider {
    fun createGreeting(): String {
        return "Hello from Kotlin/Native!"
    }

    fun formatVersion(major: Int, minor: Int): String {
        return "v$major.$minor"
    }
}

Objective-C 및 Swift Interop

iOS 코드와의 Interop은 양방향으로 작동합니다. Kotlin/Native는 Kotlin 클래스에 대한 Objective-C 헤더를 생성하며, 이는 Swift에서 자동으로 액세스할 수 있습니다. 역방향 통신은 지정된 Objective-C 이름으로 Kotlin 함수를 내보내기 위한 @ObjCName 어노테이션을 사용하여 제공됩니다. Kotlin 컬렉션은 자동으로 NSArray 및 NSDictionary로 변환되며, Kotlin 코루틴은 SKIE 라이브러리를 통해 Combine 퍼블리셔로 래핑됩니다. Kotlin에서 iOS 프레임워크를 사용하려면 Objective-C 헤더에 대한 Kotlin 바인딩을 생성하는 도구인 cinterop이 사용됩니다.

코드 예제: 설정 및 컴파일

Kotlin/Native를 시작하려면 Kotlin Multiplatform 플러그인과 대상 플랫폼을 사용하여 build.gradle.kts를 구성해야 합니다. iOS 및 Android를 지원하는 KMM 프로젝트의 최소 구성을 살펴보겠습니다.

kotlin
plugins {
    kotlin("multiplatform") version "2.0.21"
}

kotlin {
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
        iosMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
    }
}

빌드 설정 후 플랫폼별 코드를 추가할 수 있습니다. Kotlin/Native는 Kotlin 래퍼를 통해 iOS 함수에 대한 액세스를 제공합니다. 예를 들어 iOS에서 기기 UUID를 가져오려면 Foundation의 NSUUID를 호출해야 합니다.

kotlin
import platform.Foundation.NSUUID

fun getDeviceId(): String {
    return NSUUID().UUIDString()
}

fun currentTimestampMillis(): Long {
    return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}

iOS 프레임워크 빌드

iOS 프레임워크를 생성하려면 Gradle 작업 linkDebugFrameworkIosArm64 또는 프로덕션용 linkReleaseFrameworkIosArm64를 사용합니다. 빌드 후 프레임워크는 build/bin/iosArm64/debugFramework/에 위치합니다. Xcode 프로젝트에 연결은 Pods Podfile을 통해 또는 General → Frameworks, Libraries and Embedded Content에 프레임워크를 추가하여 수행됩니다.

kotlin
// iOS arm64용 릴리스 프레임워크 빌드
./gradlew :shared:linkReleaseFrameworkIosArm64

// 유니버설 프레임워크 x86_64 + arm64 빌드
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// App Store용 XCFramework 생성
./gradlew :shared:assembleReleaseXCFramework

Kotlin/Native vs Kotlin/JVM: 비교

Kotlin/Native와 Kotlin/JVM은 아키텍처, 성능 및 적용 범위에서 차이가 있습니다. Kotlin/JVM은 코드를 JVM에서 실행되는 바이트코드로 컴파일하여 방대한 Java 라이브러리 생태계에 대한 액세스를 제공하지만 설치된 가상 머신이 필요합니다. Kotlin/Native는 외부 종속성 없이 실행 파일을 생성하지만 라이브러리 생태계가 더 제한적입니다.

시작 시간 성능은 JVM 로딩이 필요 없는 Kotlin/Native에서 더 높습니다. JetBrains 벤치마크에 따르면 Kotlin/Native의 Hello World 애플리케이션은 0.003초에 시작되는 반면 Kotlin/JVM은 가상 머신을 로드하는 데 0.5~1초가 필요합니다. 그러나 Kotlin/Native의 실행 파일 크기는 포함된 런타임으로 인해 2~3배 더 클 수 있습니다.

특성Kotlin/NativeKotlin/JVM
대상 플랫폼iOS, macOS, Windows, Linux, WebAssembly, 임베디드서버, Android, 데스크톱(JVM)
종속성런타임 없음(자체 포함)JVM 필요(JDK/JRE)
시작 시간약 3ms약 500~1000ms
생태계제한적(Kotlin + Interop)완전함(Kotlin + Java + Android SDK)
바이너리 크기약 1~5MB(런타임 포함)약 100~500KB(JAR)

Kotlin/Native와 Kotlin/JVM 사이의 선택은 대상 플랫폼에 따라 다릅니다. 프로젝트가 iOS를 대상으로 하거나 최소한의 리소스 소비가 필요한 경우 Kotlin/Native가 유일한 옵션입니다. Android 개발의 경우 Kotlin/JVM이 표준으로 남아 있지만, 네이티브 성능이 필요한 NDK 구성 요소에는 Kotlin/Native가 사용됩니다. 멀티플랫폼 프로젝트에서 Kotlin Multiplatform은 두 접근 방식을 결합합니다. 공유 코드는 iOS용 Kotlin/Native를 통해, Android용 Kotlin/JVM을 통해 컴파일됩니다.

자주 묻는 질문

Kotlin/Native와 Kotlin/JVM의 차이점은 무엇인가요?

Kotlin/Native는 가상 머신 없이 코드를 네이티브 머신 코드로 컴파일하는 반면, Kotlin/JVM은 설치된 JVM이 필요한 바이트코드로 컴파일합니다. Kotlin/Native는 iOS, 임베디드 시스템 및 WebAssembly에 사용되며 Kotlin/JVM은 Android 및 서버에 사용됩니다.

KMM 없이 Kotlin/Native를 사용할 수 있나요?

네, Kotlin/Native는 지원되는 모든 플랫폼용 콘솔 애플리케이션, 네이티브 플러그인 또는 라이브러리를 만들기 위한 독립 실행형 컴파일러로 사용할 수 있습니다. KMM은 멀티플랫폼 코드 구성을 단순화할 뿐입니다.

Kotlin/Native는 iOS에서 메모리를 어떻게 관리하나요?

Kotlin/Native의 Memory Manager는 자동 사이클 감지기와 함께 참조 카운팅을 사용합니다. Kotlin 1.7.20부터 가비지 컬렉터는 @ThreadLocal 어노테이션이 필요하지 않으며 iOS 메인 스레드를 중단하지 않고 작동합니다.

Kotlin/Native에서 액세스할 수 있는 iOS 라이브러리는 무엇인가요?

cinterop을 통해 모든 iOS 프레임워크(Foundation, UIKit, CoreData, CoreBluetooth, MapKit 등 수백 개)에 액세스할 수 있습니다. JetBrains는 Kotlin/Native의 일부로 표준 iOS 라이브러리에 대한 바인딩을 제공합니다.

iOS에서 Kotlin/Native 코드를 디버깅하는 방법은?

연결된 Kotlin/Native 프레임워크와 함께 Xcode를 사용하여 디버깅합니다. Kotlin 코드의 중단점은 iOS 시뮬레이터에서 실행할 때 작동합니다. 실제 기기의 경우 Debug 빌드와 Apple 개발자 프로필이 필요합니다.

요약

  • Kotlin/Native는 Kotlin을 네이티브 코드로 변환하는 컴파일러로, Kotlin Multiplatform Mobile의 기반입니다.
  • LLVM 백엔드는 iOS, Android NDK, macOS 및 Windows를 포함한 13개 대상 플랫폼에 대한 머신 코드 생성을 제공합니다.
  • Memory Manager는 참조 카운팅을 통해 스레드를 중단하지 않고 작동하며, 이는 모바일 플랫폼에 중요합니다.
  • iOS 프레임워크는 자동으로 생성되며 embedAndSignAppleFrameworkForXcode를 통해 Xcode 프로젝트에 연결됩니다.
  • Objective-C 및 Swift Interop은 cinterop과 @ObjCName을 통해 네이티브 iOS 코드와의 양방향 통합을 제공합니다.
  • 시작 성능이 Kotlin/Native가 JVM 버전보다 훨씬 뛰어납니다 — 0.5~1초 대신 최대 0.003초.
  • JVM을 사용할 수 없거나 바람직하지 않은 iOS, 임베디드 시스템 및 WebAssembly에는 Kotlin/Native를 사용하세요.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기