Kotlin
1. 개요
1. 개요
코틀린은 JetBrains에서 개발한 정적 타입 프로그래밍 언어이다. 2011년에 처음 공개되었으며, 자바 가상 머신 상에서 동작하도록 설계되었다. 주된 용도는 안드로이드 애플리케이션 개발이며, 서버사이드 개발과 크로스플랫폼 개발에도 널리 사용된다.
이 언어는 자바와의 완벽한 상호운용성을 핵심 목표로 삼아 개발되었다. 기존의 자바 프레임워크와 라이브러리를 그대로 활용할 수 있어, 자바 생태계를 계승하면서도 더 현대적이고 간결한 문법을 제공한다. 이러한 특징 덕분에 기존 자바 프로젝트에 점진적으로 도입하거나 혼용하는 것이 용이하다.
코틀린은 간결성과 실용성을 중시한다. 널 안전성을 언어 차원에서 지원하여 널 포인터 예외로 인한 런타임 오류를 방지하고, 함수형 프로그래밍 패러다임을 편리하게 사용할 수 있는 기능들을 제공한다. 또한 코루틴을 공식적으로 지원하여 비동기 프로그래밍을 더 쉽게 작성할 수 있게 한다.
주요 개발 도구로는 JetBrains의 IntelliJ IDEA가 있으며, 안드로이드 공식 개발 환경인 Android Studio에도 완벽하게 통합되어 있다. Gradle과 Maven 같은 빌드 도구를 통한 프로젝트 관리도 잘 지원된다.
2. 역사
2. 역사
코틀린의 개발은 2010년 JetBrains에서 시작되었다. 당시 JetBrains는 자바에 대한 대체 언어의 필요성을 느끼고 있었는데, 기존 자바는 현대적이지 않은 장황한 문법을 가지고 있었고, 스칼라와 같은 대안 언어들은 컴파일 속도가 느리거나 학습 곡선이 높다는 문제가 있었다. 이에 JetBrains는 자바 가상 머신(JVM) 상에서 동작하면서도 더 간결하고 실용적이며, 자바와 완벽한 상호운용성을 갖춘 새로운 언어를 만들기로 결정했다.
이 프로젝트는 2011년 7월에 처음으로 공개되었으며, 상트페테르부르크 인근의 코틀린 섬에서 이름을 따왔다. 2012년 2월에는 아파치 2.0 라이선스 하에 오픈 소스로 전환되어 커뮤니티의 기여를 받기 시작했다. 약 4년간의 개발과 테스트를 거쳐, 코틀린 1.0 정식 버전이 2016년 2월 15일에 출시되었다. 이는 언어가 안정화되어 프로덕션 환경에서 사용할 수 있음을 의미하는 중요한 이정표였다.
코틀린의 역사에서 가장 큰 전환점은 2017년 구글이 안드로이드 애플리케이션 개발의 공식 지원 언어로 코틀린을 추가한 것이었다. 이 결정은 코틀린의 안드로이드 생태계 내 입지를 급격히 높였으며, 이후 구글은 자체 안드로이드 샘플 코드와 가이드에서 코틀린을 우선시하기 시작했다. 이로 인해 코틀린은 안드로이드 개발 분야에서 빠르게 주류 언어로 자리잡게 되었다.
이후 코틀린은 서버사이드 개발, iOS, 웹 어셈블리 등을 포함한 멀티플랫폼 개발을 지원하는 방향으로 지속적으로 확장되고 있다. 코틀린/네이티브와 코틀린/JS 같은 프로젝트를 통해 JVM 이외의 다양한 플랫폼을 타겟팅할 수 있게 되었으며, 이를 통해 언어의 적용 범위는 안드로이드를 넘어 더 넓은 영역으로 성장해 나가고 있다.
3. 특징
3. 특징
3.1. JVM 및 멀티플랫폼 지원
3.1. JVM 및 멀티플랫폼 지원
코틀린은 JVM 위에서 동작하는 것을 기본으로 설계되었지만, 그 목표는 단일 언어로 다양한 플랫폼을 대상으로 하는 멀티플랫폼 개발을 지원하는 데 있다. 이는 코틀린 컴파일러가 소스 코드를 다양한 대상(타겟)으로 변환할 수 있는 능력을 갖추고 있기 때문에 가능하다.
코틀린의 핵심 컴파일 타겟은 JVM 바이트코드이다. 자바와의 완벽한 상호운용성을 바탕으로, 기존의 자바 프레임워크와 라이브러리를 그대로 활용하면서 코틀린의 현대적 문법으로 개발할 수 있다. 이는 안드로이드 앱 개발과 서버사이드 개발(예: 스프링 프레임워크)에서 널리 채택되는 주요 이유가 되었다.
JVM 외에도 코틀린은 Kotlin/JS를 통해 자바스크립트로, Kotlin/Native를 통해 다양한 운영체제(iOS, macOS, 윈도우, 리눅스)의 네이티브 실행 파일로 컴파일될 수 있다. 이러한 멀티플랫폼 지원은 Kotlin 멀티플랫폼 모바일과 같은 프로젝트를 통해 비즈니스 로직을 안드로이드와 iOS 앱 사이에서 공유하는 개발 모델을 실현한다.
이러한 접근 방식은 개발자가 단일 코드베이스에서 여러 플랫폼을 대상으로 할 수 있게 하여 생산성을 높이고, 동시에 각 플랫폼의 네이티브 성능과 사용자 경험을 유지할 수 있도록 돕는다.
3.2. 널 안전성
3.2. 널 안전성
코틀린의 널 안전성은 널 포인터 예외를 방지하기 위해 설계된 핵심 기능이다. 이 시스템은 타입 시스템 자체에 널 가능성을 명시적으로 통합함으로써 작동한다. 모든 변수는 기본적으로 널을 허용하지 않는 타입으로 간주되며, 변수 선언 시 타입 뒤에 ?를 붙여야만 널 값을 가질 수 있는 널러블 타입이 된다.
널러블 타입의 변수를 직접 사용하려고 하면 컴파일 시점에 오류가 발생한다. 이를 안전하게 처리하기 위해 코틀린은 안전 호출 연산자(?.)와 엘비스 연산자(?:)를 제공한다. 안전 호출 연산자는 객체가 널이 아닐 때만 메서드나 프로퍼티에 접근하고, 널이면 전체 표현식의 결과를 널로 만든다. 엘비스 연산자는 널러블 표현식이 널일 경우 사용할 대체값을 지정한다. 또한, 안전한 형 변환 연산자(as?)는 형 변환이 불가능할 때 예외를 던지는 대신 널을 반환한다.
이러한 널 안전성 메커니즘은 자바와의 완벽한 상호운용성을 유지하면서도 적용된다. 자바에서 가져온 타입은 플랫폼 타입으로 취급되며, 개발자는 이에 대해 널 가능성 어노테이션을 추가하거나 코틀린의 널 검사를 사용하여 안전하게 처리할 수 있다. 이로 인해 JVM 상에서 실행되더라도 런타임 오버헤드 없이 컴파일 시점에 많은 널 관련 오류를 사전에 차단할 수 있다.
3.3. 함수형 프로그래밍 지원
3.3. 함수형 프로그래밍 지원
코틀린은 함수형 프로그래밍의 핵심 개념을 잘 지원하는 다중 패러다임 언어이다. 객체지향 프로그래밍과 함께 함수형 스타일을 혼합하여 사용할 수 있도록 설계되었다. 이를 통해 더 간결하고 표현력이 풍부하며 안전한 코드를 작성할 수 있다.
코틀린은 일급 함수를 지원한다. 이는 함수를 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 함수의 반환값으로 사용할 수 있음을 의미한다. 또한 람다 식과 익명 함수를 통해 이름 없이 함수를 간결하게 정의할 수 있어, 고차 함수를 사용한 콜백 처리나 컬렉션 연산을 직관적으로 작성할 수 있다. 확장 함수는 기존 클래스의 수정 없이 새로운 함수를 추가하는 기능으로, 함수형 스타일의 유틸리티 함수를 쉽게 정의할 수 있게 해준다.
표준 라이브러리는 함수형 프로그래밍을 위한 풍부한 API를 제공한다. 컬렉션에 대해 map, filter, reduce와 같은 함수형 연산을 제공하여, 반복문과 상태 변수를 줄이고 선언적인 방식으로 데이터를 변환하고 처리할 수 있다. 시퀀스는 지연 평가를 통해 대규모 데이터 처리를 더 효율적으로 수행할 수 있도록 한다.
또한, 코틀린은 널 안전성과 결합된 안전한 함수형 구문을 제공한다. let, apply, with, run, also와 같은 범위 지정 함수를 활용하면 널 검사와 객체 초기화, 구성 작업을 깔끔한 체인 형태로 처리할 수 있다. 이러한 특징들은 자바에 비해 부수 효과를 줄이고 불변성을 장려하는 함수형 코드 작성을 용이하게 한다.
3.4. 자바와의 상호운용성
3.4. 자바와의 상호운용성
코틀린의 가장 큰 장점 중 하나는 자바와의 완벽한 상호운용성이다. 코틀린은 JVM 상에서 동작하도록 설계되었으며, 기존의 방대한 자바 생태계와의 원활한 통합을 최우선 목표로 삼았다. 이로 인해 개발자는 기존 자바 라이브러리, 프레임워크, 그리고 모든 자바 코드를 코틀린 프로젝트에서 그대로 사용할 수 있다. 반대로, 코틀린으로 작성된 코드도 자바 코드에서 문제없이 호출이 가능하다. 이러한 양방향 호환성은 기업이 점진적으로 자바 코드베이스를 코틀린으로 마이그레이션하거나, 두 언어를 혼용하여 개발하는 것을 가능하게 한다.
이러한 상호운용성은 구체적인 기능으로 구현된다. 코틀린 컴파일러는 자바 바이트코드를 생성하며, 자바 가상 머신이 이를 실행한다. 코틀린과 자바의 자료형 시스템은 서로 매핑되어 있어, 예를 들어 코틀린의 String은 자바의 java.lang.String이 되고, 코틀린의 List<Int>는 자바의 java.util.List<Integer>로 변환된다. 또한, 코틀린 코드에서 자바의 게터와 세터는 코틀린의 속성처럼 자연스럽게 접근할 수 있다. 코틀린의 널 안전성 기능도 자바 코드와 상호작용할 때 적절히 처리된다.
이러한 깊은 통합 덕분에 코틀린은 안드로이드 개발뿐만 아니라, 스프링 프레임워크를 사용한 서버사이드 개발에서도 널리 채택되었다. 개발팀은 새로운 모듈을 코틀린으로 작성하면서도 기존의 자바 모듈과 손쉽게 연동할 수 있다. 결과적으로 코틀린은 현대적이고 간결한 문법의 이점을 취하면서도, 자바의 견고한 생태계와 도구를 그대로 활용할 수 있는 실용적인 언어로 자리 잡았다.
4. 문법 및 기본 개념
4. 문법 및 기본 개념
4.1. 변수와 자료형
4.1. 변수와 자료형
코틀린은 변수 선언 시 변수와 상수를 구분하는 var와 val 키워드를 사용한다. var는 가변 변수로, 값을 재할당할 수 있다. 반면 val은 불변 참조로, 일단 값이 할당되면 변경할 수 없다. 이는 자바의 final 변수와 유사하지만, 코틀린에서는 기본적으로 불변성을 권장하는 패러다임을 따른다.
코틀린은 정적 타입 프로그래밍 언어이지만, 대부분의 경우 타입 추론이 가능하여 변수 타입을 명시적으로 선언하지 않아도 된다. 컴파일러가 초기화 식의 타입을 분석하여 변수의 타입을 자동으로 결정한다. 주요 기본 자료형으로는 정수형인 Byte, Short, Int, Long, 부동소수점형인 Float, Double, 논리형인 Boolean, 문자형인 Char 등이 있으며, 이들은 자바의 원시 타입과 달리 모두 객체로 취급되어 메서드를 호출할 수 있다.
코틀린 타입 시스템의 가장 큰 특징은 널 안전성이다. 기본적으로 모든 변수는 널이 될 수 없는 타입으로, null을 할당하려고 하면 컴파일 오류가 발생한다. 변수에 null 값을 허용하려면 타입 이름 뒤에 ?를 붙여 널이 될 수 있는 타입으로 명시적으로 선언해야 한다. 이는 널 포인터 예외를 방지하는 데 핵심적인 역할을 한다.
문자열 템플릿 기능을 통해 변수 값을 문자열 내에 쉽게 삽입할 수 있다. $ 기호 뒤에 변수명을 사용하거나, ${} 안에 표현식을 넣어 값을 평가하고 문자열로 변환할 수 있다. 또한, 코틀린은 자바와 완벽한 상호운용성을 가지므로, 자바의 모든 클래스와 자료형을 코틀린 코드에서 자연스럽게 사용할 수 있다.
4.2. 함수
4.2. 함수
코틀린에서 함수는 fun 키워드를 사용하여 선언한다. 함수의 매개변수는 이름: 타입 형식으로 정의하며, 반환 타입은 매개변수 목록 뒤에 : 타입 형태로 명시한다. 반환값이 없는 경우, 자바의 void에 해당하는 Unit 타입을 사용하거나 생략할 수 있다.
함수는 표현식 본문을 가질 수 있어, 단일 표현식의 결과를 반환하는 함수를 간결하게 작성할 수 있다. 또한, 기본값을 가진 매개변수를 정의할 수 있어 함수 오버로딩의 필요성을 줄인다. 가변 인자를 받으려면 vararg 키워드를 사용한다.
코틀린은 확장 함수를 지원하여 기존 클래스에 새로운 함수를 추가하는 것처럼 사용할 수 있다. 또한, 고차 함수와 람다 표현식을 통해 함수형 프로그래밍 스타일을 적극적으로 지원한다. 함수는 일급 객체로 취급되어 변수에 할당하거나 다른 함수의 인자 및 반환값으로 사용될 수 있다.
4.3. 클래스와 객체
4.3. 클래스와 객체
코틀린은 객체지향 프로그래밍과 함수형 프로그래밍 패러다임을 모두 지원하는 언어로, 클래스와 객체를 정의하고 사용하는 방식은 자바와 유사하지만 더 간결하고 강력한 기능을 제공한다. 클래스는 class 키워드로 선언하며, 기본적으로 모든 클래스는 final이다. 즉, 상속을 허용하려면 클래스 선언 앞에 open 키워드를 명시적으로 붙여야 한다. 이는 의도하지 않은 상속을 방지하여 더 안전한 코드를 작성하도록 유도한다.
코틀린의 클래스는 주 생성자와 하나 이상의 보조 생성자를 가질 수 있다. 주 생성자는 클래스 헤더에 선언하며, 생성자 매개변수는 val 또는 var로 선언하면 자동으로 해당 클래스의 프로퍼티가 된다. 보조 생성자는 constructor 키워드로 클래스 본문 내에 정의한다. init 블록을 사용하면 객체가 생성될 때 실행될 초기화 코드를 작성할 수 있다.
특히 유용한 기능으로 data 클래스가 있다. data class로 선언하면 컴파일러가 equals(), hashCode(), toString(), copy() 메서드를 자동으로 생성해준다. 이는 롬복의 @Data 애노테이션과 유사한 효과로, 값 객체를 간편하게 정의할 때 매우 효율적이다. 싱글톤 객체를 생성할 때는 class 대신 object 키워드를 사용한다. object 선언은 스레드 안전한 싱글톤 인스턴스를 즉시 생성한다. 또한, companion object를 클래스 내부에 선언하면 자바의 정적 메서드와 유사한 기능을 구현할 수 있으며, 이는 팩토리 메서드를 제공하는 데 자주 활용된다.
4.4. 제어 흐름
4.4. 제어 흐름
코틀린의 제어 흐름은 조건문과 반복문을 통해 프로그램의 실행 경로를 결정하는 방식을 말한다. 기존 자바의 문법을 간결하고 표현력 있게 개선했으며, 여러 기능을 표현식으로 사용할 수 있어 코드를 더욱 축약할 수 있다.
조건문은 if와 when을 주로 사용한다. if는 자바와 유사하지만, 코틀린에서는 표현식으로 취급되어 그 결과를 변수에 직접 대입할 수 있다. when은 자바의 switch 문을 대체하며, 훨씬 더 강력하고 유연하다. when은 단순한 값 매칭뿐만 아니라, 범위 검사(in, !in), 타입 검사(is, !is), 임의의 조건식까지도 분기 조건으로 사용할 수 있다. 각 분기는 - 화살표로 구분하며, 암시적으로 break가 적용되어 다음 분기로 넘어가지 않는다.
반복문은 for와 while을 지원한다. for 문은 주로 컬렉션이나 범위를 순회할 때 사용하며, in 연산자와 함께 쓰인다. .. 연산자로 생성한 범위(1..10)나 downTo, step, until 같은 함수를 조합하여 다양한 반복 패턴을 쉽게 표현할 수 있다. while과 do-while 문은 자바와 동일하게 동작한다.
코틀린은 예외 처리를 위한 try, catch, finally 블록도 제공한다. 다만 자바와 달리 throw가 표현식이므로 다른 표현식 내에서 사용할 수 있으며, 검사 예외를 강제하지 않는 특징이 있다.
5. 주요 사용 분야
5. 주요 사용 분야
5.1. 안드로이드 애플리케이션 개발
5.1. 안드로이드 애플리케이션 개발
코틀린은 2017년 구글에 의해 안드로이드 애플리케이션 개발의 공식 언어로 채택되면서, 해당 분야에서 가장 주목받는 언어 중 하나가 되었다. 이 결정은 기존에 널리 사용되던 자바에 비해 코틀린이 제공하는 간결한 문법과 향상된 안전성, 특히 널 안전성이 모바일 개발 생산성을 크게 향상시킬 수 있다는 판단에 기반했다. 이후 구글은 자체 안드로이드 프로젝트에서 코틀린을 우선 언어로 사용하기 시작했으며, 공식 문서와 샘플 코드도 코틀린을 중심으로 제공하고 있다.
안드로이드 스튜디오는 코틀린을 완벽하게 지원하는 통합 개발 환경으로, 인텔리제이 IDEA를 기반으로 구축되었다. 개발자들은 자바로 작성된 기존 코드베이스를 유지하면서도, 새로운 기능을 코틀린으로 점진적으로 구현하거나 전체 프로젝트를 마이그레이션할 수 있다. 코틀린의 상호운용성은 100% 지원되어, 자바 라이브러리를 자유롭게 호출하거나 반대로 코틀린 코드를 자바에서 사용하는 것이 가능하다. 이는 방대한 기존 자바 생태계를 그대로 활용할 수 있음을 의미한다.
주요 사용 사례로는 카카오톡의 메시징 서버 개편이 있으며, 코드 양의 감소와 생산성 향상이 보고되었다. 안드로이드 개발에서 코틀린은 확장 함수, 람다식, 코루틴과 같은 현대적인 언어 기능을 통해 반복적이고 장황한 코드를 줄이고, 비동기 처리와 UI 업데이트를 더 효율적으로 작성할 수 있게 한다. 또한 널 포인터 예외를 컴파일 단계에서 크게 줄여주는 널 안전성은 모바일 앱의 안정성을 높이는 데 기여한다.
5.2. 서버사이드 개발
5.2. 서버사이드 개발
코틀린은 자바 생태계와의 완벽한 상호운용성을 바탕으로 서버사이드 개발 분야에서도 널리 사용된다. 자바 가상 머신 위에서 동작하며 기존 자바로 작성된 모든 라이브러리와 프레임워크를 그대로 활용할 수 있어, 기업의 기존 인프라를 유지하면서 점진적으로 언어를 전환하는 데 유리하다. 특히 스프링 프레임워크 공식에서 코틀린을 완전히 지원함에 따라, 마이크로서비스 아키텍처나 REST API 개발 등 현대적인 백엔드 개발에 적극적으로 도입되고 있다.
코틀린의 간결하고 안전한 문법은 서버 개발의 생산성과 유지보수성을 높인다. 널 안전성은 런타임 중 발생할 수 있는 NullPointerException을 컴파일 시점에 크게 줄여 안정성을 보장하며, 데이터 클래스, 확장 함수, 코루틴과 같은 기능은 복잡한 비즈니스 로직을 표현력 있게 작성하는 데 도움을 준다. 코루틴은 특히 비동기 프로그래밍을 간소화하여 블로킹 문제를 효율적으로 처리하고 동시성을 관리할 수 있게 한다.
주요 서버사이드 개발을 위한 코틀린 전용 도구와 프레임워크도 등장했다. JetBrains가 개발한 Ktor는 가볍고 비동기적인 웹 프레임워크이며, Exposed나 Ktorm 같은 SQL 기반 ORM 라이브러리도 활발히 사용된다. 이처럼 코틀린은 안드로이드 개발을 넘어 풀스택 개발 언어로서의 입지를 다지고 있으며, 자바에 비해 더 간결하고 현대적인 대안으로 자리 잡고 있다.
5.3. 크로스플랫폼 개발
5.3. 크로스플랫폼 개발
코틀린은 JVM 및 네이티브 코드 컴파일을 넘어 크로스플랫폼 개발을 공식적으로 지원하는 현대적인 언어이다. 이를 위한 핵심 도구는 코틀린 멀티플랫폼 프로젝트이다. 이 기술은 비즈니스 로직, 데이터 모델, 네트워킹 계층과 같은 공통 코드를 한 번 작성한 후, 안드로이드, iOS, 웹, 데스크톱 등 다양한 대상 플랫폼에 배포할 수 있도록 설계되었다.
코틀린 멀티플랫폼의 접근 방식은 코틀린/JVM, 코틀린/JS, 코틀린/네이티브 컴파일러를 활용한다. 개발자는 공통 모듈에 플랫폼에 독립적인 코드를 작성하고, 플랫폼별 모듈에서는 해당 운영체제의 API나 UI 프레임워크에 접근하는 코드를 작성한다. 이 아키텍처는 모바일 애플리케이션 개발에서 특히 두드러지게 활용되며, 안드로이드 스튜디오와 Xcode에서 각각 네이티브 UI를 구축하면서도 핵심 로직을 공유할 수 있다.
이를 통해 개발 팀은 안드로이드와 iOS 앱을 위한 별도의 코드베이스를 유지할 필요가 줄어들어 생산성이 향상되고 버그 발생 가능성이 감소한다. 코틀린의 크로스플랫폼 생태계는 JetBrains에 의해 주도적으로 개발되며, Gradle을 빌드 시스템으로 사용하여 모듈화와 의존성 관리를 지원한다. 이는 플러터나 리액트 네이티브와 같은 다른 크로스플랫폼 솔루션과 차별화되는, 네이티브 성능과 UI를 중시하는 접근법을 제공한다.
6. 개발 환경 및 도구
6. 개발 환경 및 도구
6.1. IntelliJ IDEA 및 Kotlin 플러그인
6.1. IntelliJ IDEA 및 Kotlin 플러그인
코틀린의 공식 통합 개발 환경은 JetBrains가 개발한 IntelliJ IDEA이다. 코틀린 언어 자체가 JetBrains에 의해 개발되었기 때문에, IntelliJ IDEA는 코틀린 지원을 최우선으로 하며 가장 완벽한 개발 경험을 제공한다. IntelliJ IDEA의 커뮤니티 에디션은 무료로 사용할 수 있어 코틀린 학습 및 개발에 널리 활용된다.
IntelliJ IDEA에는 코틀린 플러그인이 기본적으로 내장되어 있어 별도의 설치 없이 코틀린 프로젝트 생성, 코드 작성, 디버깅, 리팩토링 등의 기능을 즉시 사용할 수 있다. 이 플러그인은 코틀린의 간결한 문법을 활용한 스마트 코드 완성, 널 안전성 관련 경고 및 자동 수정, 자바 코드와의 상호운용성을 위한 원활한 코드 분석 등 강력한 기능을 제공한다. 또한, 기존 자바 프로젝트에 코틀린 파일을 추가하거나 자바 코드를 코틀린 코드로 변환하는 기능도 지원한다.
안드로이드 스튜디오는 IntelliJ IDEA 플랫폼을 기반으로 구글이 개발한 안드로이드 전용 통합 개발 환경이다. 2017년 코틀린이 안드로이드 공식 언어로 채택된 이후, 안드로이드 스튜디오 역시 코틀린 개발을 위한 모든 기능을 탑재하고 있다. 따라서 안드로이드 애플리케이션 개발은 대부분 안드로이드 스튜디오에서 코틀린을 사용하여 이루어진다.
IntelliJ IDEA 이외에도 이클립스와 같은 다른 통합 개발 환경에서도 코틀린 플러그인을 설치하여 사용할 수 있으나, 공식 지원 및 기능의 완성도 측면에서는 IntelliJ IDEA 계열의 개발 환경이 가장 권장된다.
6.2. 빌드 도구 (Gradle, Maven)
6.2. 빌드 도구 (Gradle, Maven)
코틀린 프로젝트를 빌드하고 의존성을 관리하기 위해 주로 사용되는 도구는 그레이들(Gradle)과 메이븐(Maven)이다. 이 두 도구는 자바 생태계에서 표준적으로 사용되는 빌드 자동화 도구이며, 코틀린은 이들과 완벽하게 통합되어 있다.
그레이들은 Groovy 또는 Kotlin DSL(도메인 특화 언어)로 작성된 빌드 스크립트를 사용한다. 코틀린 프로젝트에서는 build.gradle.kts 파일을 통해 빌드 구성을 정의하며, 코틀린 플러그인을 적용하여 코틀린 코드를 컴파일하고 패키징할 수 있다. 그레이들은 증분 빌드와 빌드 캐시를 지원하여 대규모 프로젝트에서도 빠른 빌드 속도를 제공하는 것이 특징이다. 특히 안드로이드 스튜디오의 공식 빌드 시스템으로 채택되면서 안드로이드 개발에서 코틀린과 함께 가장 널리 사용된다.
반면 메이븐은 XML 기반의 pom.xml 파일을 사용하여 빌드 구성을 선언적으로 정의한다. 설정이 표준화되어 있어 프로젝트 구조가 명확하고, 중앙 저장소를 통한 의존성 관리가 용이하다. 코틀린 프로젝트에서 메이븐을 사용하려면 kotlin-maven-plugin을 pom.xml에 추가하여 코틀린 컴파일을 설정해야 한다. 메이븐은 전통적인 자바 프로젝트에서 많이 사용되며, 기존 메이븐 기반 프로젝트에 코틀린을 점진적으로 도입하는 경우에 유용하다.
두 도구 모두 코틀린 컴파일러(kotlinc)를 호출하여 JVM 바이트코드, JavaScript 또는 네이티브 코드로 컴파일하는 작업을 관리할 수 있다. 또한 자바 라이브러리와의 상호운용성을 위해 생성된 바이트코드를 JAR 파일로 패키징하는 기능도 제공한다. 개발자는 프로젝트의 규모, 팀의 익숙함, 필요한 기능에 따라 그레이들과 메이븐 중 선택하여 사용할 수 있다.
6.3. Kotlin 컴파일러
6.3. Kotlin 컴파일러
코틀린 컴파일러는 코틀린 소스 코드를 다양한 대상 플랫폼의 실행 가능한 형태로 변환하는 핵심 도구이다. JetBrains가 개발한 이 컴파일러는 JVM 바이트코드, JavaScript, 그리고 네이티브 기계어 등 여러 출력을 생성할 수 있는 멀티플랫폼 특성을 지닌다. 컴파일러 자체는 오픈 소스로 공개되어 있으며, 코틀린 생태계의 확장 가능성을 제공하는 기반이 된다.
주요 컴파일러 백엔드로는 코틀린/JVM, 코틀린/JS, 그리고 Kotlin/Native가 있다. 코틀린/JVM은 자바 가상 머신용 바이트코드를 생성하며, 이는 자바와의 완벽한 상호운용성을 보장한다. 코틀린/JS는 코틀린 코드를 JavaScript로 변환하여 웹 브라우저나 Node.js 환경에서 실행할 수 있게 한다. Kotlin/Native는 LLVM 컴파일러 인프라를 이용하여 iOS, macOS, Linux, Windows 등 다양한 운영체제를 위한 독립 실행형 네이티브 바이너리를 생성한다.
컴파일러는 일반적으로 Gradle이나 Maven 같은 빌드 도구를 통해 프로젝트에 통합되어 사용된다. IntelliJ IDEA 및 Android Studio와 같은 통합 개발 환경은 이 컴파일러를 내장하고 있어, 실시간 코드 분석, 자동 완성, 리팩토링 등의 고급 기능을 지원한다. 명령줄에서도 kotlinc 명령어를 통해 직접 컴파일을 수행할 수 있다.
컴파일러의 지속적인 발전은 코틀린 언어의 진화와 밀접하게 연관되어 있다. 각 새로운 언어 버전은 대응하는 컴파일러 버전과 함께 출시되며, 성능 최적화, 새로운 언어 기능 지원, 그리고 Kotlin/Wasm과 같은 실험적 타겟 플랫폼에 대한 지원이 추가되고 있다.
