코틀린 (프로그래밍 언어)
코틀린(영어: Kotlin, IPA: /ˈkɒtlɪn/[2])은 젯브레인즈사에서 개발하는 크로스 플랫폼 범용 프로그래밍 언어로, 자바와 완벽하게 호환되게 설계되었으며 일반적으로 JVM에서 사용되나 자바스크립트, LLVM 그리고 데이터 사이언스 영역에서도 사용 가능하다.
패러다임 | 다중 패러다임 (객체 지향, 함수형, 명령형, 선언형, 범용, 블록, 반영, 병행) |
---|---|
설계자 | 젯브레인즈 |
개발자 | 젯브레인즈 |
발표일 | 2011년 7월 22일 |
최근 버전 | 1.9.22[1] |
최근 버전 출시일 | 2023년 12월 21일 |
자료형 체계 | 정적타입, 강타입, 추론적 타입 |
플랫폼 | JVM, 자바스크립트, LLVM, 데이터 사이언스 |
운영 체제 | 크로스 플랫폼 |
라이선스 | 아파치 라이선스 2.0 |
파일 확장자 |
|
웹사이트 | kotlinlang |
영향을 받은 언어 | |
파일 확장자는 일반적으로 .kt를 사용하며 코틀린 스크립트는 .kts를 사용한다.
코틀린은 2019년 5월 7일 이후로 구글의 안드로이드 앱 개발에서 선호하는 언어가 되었다.[3]
역사
2011년 7월, 젯브레인즈는 1년 간 개발되고 있던, JVM의 새로운 언어인 프로젝트 코틀린을 공개하였다.[4] 젯브레인즈의 개발을 주도하던 드미트리(Dmitry Jemerov)는 스칼라를 제외한 대부분의 언어들에는 찾고자 하던 기능이 존재하지 않았다고 언급하였다. 그러나 스칼라의 느린 컴파일 시간을 단점으로 지적하였다.[4] 코틀린의 언급된 목표들 가운데 하나는 자바만큼 빠르게 컴파일하는 것이다. 2012년 2월, 젯브레인즈는 이 프로젝트를 아파치 2 라이선스로 오픈 소스화했다.[5]
코틀린이라는 이름은 코틀린섬에서 비롯된 것이다. Andrey Breslav는 팀이 이 이름을 결정하게 된 이유로는 자바가 인도네시아의 자와섬에서 이름을 가져왔듯, 코틀린도 똑같이 코틀린섬에서 이름을 가져오기로 한 것에서 비롯된다.[6](그러나 프로그래밍 언어 자바는 커피 '자바'에서 이름을 가져온 것으로 추정된다)[7]
젯브레인즈는 이 새로운 언어가 IntelliJ IDEA 판매를 상승시켜주길 희망하였다.[8]
코틀린 v1.0은 2016년 2월 15일 출시되었다.[9] 이는 최초의 공식 안정판으로 간주되며 젯브레인즈는 이 버전을 기점으로 장기간의 하위 호환성을 약속하였다.
구글 I/O 2017에서 구글은 안드로이드에서 코틀린이 공식 지원 언어에 추가 되었으며[10] 2019년부터는 안드로이드 개발을 위한 공식 언어로 지정되었다.[11][12]
버전 정보
버전 | 출시일 | 주요 변경 사항 |
---|---|---|
1.0 | 2016년 2월 14일[13] | 정식 버전 (안정화 버전) 출시 |
1.1 | 2016년 2월 15일[14] | Kotlin/JS 안정화 버전 |
1.2 | 2017년 11월 27일[15] | Kotlin/Multiplatform 실험 버전 출시 JVM과 자바스크립트간의 코드 공유 기능 추가 |
1.3 | 2018년 10월 29일[16] | 코루틴 지원 추가 |
1.4.0 | 2020년 8월 17일[16] | 오브젝티브-C 및 스위프트 지원 추가 Kotlin/Multiplatform 알파 버전 출시 |
1.5.0 | 2021년 5월 5일[16] | 자바 레코드 클래스 지원 추가 serial 클래스 지원 추가 신규 IR 컴파일러 공개 |
1.6.0 | 2021년 11월 16일[16] | Kotlin/Native 신규 메모리 관리자 추가 Duration API 안정화 |
1.7.0 | 2022년 6월 9일[16] | 코틀린 K2 컴파일러 알파 버전 공개 Gradle 증분 빌드 시 새로운 접근 방법 적용 |
1.8.0 | 2022년 12월 28일[16] | kotlin-reflect 성능 개선 오브젝티브-C 및 스위프트 상호운용성 개선 |
1.9.0 | 2023년 7월 26일[17] | 코틀린 K2 컴파일러 베타 버전 업데이트 열거형 클래스 값 함수의 대체 안정화 |
2.0.0 | ?[18] | 코틀린 K2 컴파일러 안정화 |
출시 주기
기존 코틀린은 로드맵의 기능이 모두 준비가 완료되어야 출시하는 방식을 사용하였는데 1.4 버전이 출시에 2년 가까이 걸리게 되자 1.5 버전 이후 부터는 새로운 릴리즈 주기를 도입하였다.[19]
기능 릴리즈 (Feature relases)
주요 기능 업데이트, Kotlin 언어의 자체 기능이 추가되는 릴리즈다.
1년의 두번 릴리즈되며 1.5.0, 1.6.0 등 마이너 버전이 증가한다.
증분 릴리즈 (Incremental releases)
언어의 변경사항이 포함되지 않는 릴리즈, 일반적으로 컴파일러의 개선, 성능 향상등의 업데이트가 포함된다.
2~3개월마다 릴리즈되며 1.5.10, 1.5.20 등 패치 버전의 10의 자릿 수가 증가한다.
버그 수정 릴리즈(Bug fix release)
대부분 핫픽스이며 기능 릴리즈 혹은 증분 릴리즈 출시 1~2주 내에 출시된다. 중요하지 않은 마이너 버그는 증분 릴리즈에서 수정되기도 한다.
1.3.71, 1.3.72 등 패치 버전의 1의 자릿수가 증가한다.
플랫폼
Kotlin/JVM
코틀린을 JVM에서 작동하기 위한 런타임 및 컴파일러로 코틀린 표준 라이브러리는 자바 API를 기반으로 작성되었으며 코틀린 리플렉션을 통해 자바 리플렉션 기능을 지원한다. 일반적인 필수 활용 코드를 자바와 더불어 기능적 지원 또한 가능하다.
일반적으로 안드로이드 및 서버 사이드(스프링 프레임워크 등) 개발에 사용된다.
Kotlin/JS
코틀린을 웹 브라우저 및 Node.js 등 자바스크립트 엔진에서 작동하기 위한 런타임 및 컴파일러로 타입스크립트 타입 정의 파일을 감지, 생성할 수 있고 사용하지 않는 코틀린 표준 라이브러리에서 사용되지 않는 코드를 제거하는 플러그인이 내장되어 있다.[20]
Kotlin/Native
코틀린으로 응용 소프트웨어 및 모바일 응용 소프트웨어 개발을 위한 런타임 및 컴파일러로 LLVM을 기반으로 작동한다.
마이크로소프트 윈도우, 리눅스, Mac OS, iOS 응용 소프트웨어 개발 및 웹어셈블리 개발에 사용된다.
C, 오브젝티브-C 그리고 코코아팟의 상호운용성을 보장한다.
Kotlin/Multiplatform
코틀린으로 크로스 플랫폼 개발을 위한 런타임 및 컴파일러로 라이브러리, 백엔드 서버, 웹, 데스트탑 앱(마이크로소프트 윈도우, 리눅스, Mac OS) 모바일 앱(iOS, 안드로이드) 개발에 사용된다.
문법
일반적인 사용법
fun main() { val name = "stranger" // 첫번째 변수 선언 println("Hi, $name!") // ...그리고 사용! print("Current count:") for (i in 0..10) { // 0에서 10까지 반복 print(" $i") }}
비동기 코드
import kotlinx.coroutines.*suspend fun main() { // 일시 중단 후 나중에 재개하는 기능 val start = System.currentTimeMillis() coroutineScope { // 코루틴 범위 생성 for (i in 1..10) { launch { // 10개의 병렬 작업 delay(3000L - i * 300) // 일시 중지 log(start, "Countdown: $i") } } } // `coroutineScope` 안의 내용이 모두 실행되면 표시합니다 log(start, "Liftoff!")}fun log(start: Long, msg: String) { println("$msg " + "(on ${Thread.currentThread().name}) " + "after ${(System.currentTimeMillis() - start)/1000F}s")}
- 비동기 코드 작성을 위해서 kotlinx.coroutines 라이브러리를 따로 설치해야한다.
객체 지향
abstract class Person(val name: String) { abstract fun greet()}interface FoodConsumer { fun eat() fun pay(amount: Int) = println("Delicious! Here's $amount bucks!")}class RestaurantCustomer(name: String, val dish: String) : Person(name), FoodConsumer { fun order() = println("$dish, please!") override fun eat() = println("*Eats $dish*") override fun greet() = println("It's me, $name.")}fun main() { val sam = RestaurantCustomer("Sam", "Mixed salad") sam.greet() //추상 클래스에서 구현된 함수 sam.order() // 멤버 함수 sam.eat() // 인터페이스에서 정의되어 구현된 함수 sam.pay(10) //인터페이스에서 기본 정의된 함수}
함수형
fun main() { // 누가 가장 많은 메시지를 보냈을까요? val frequentSender = messages .groupBy(Message::sender) .maxByOrNull { (_, messages) -> messages.size } ?.key // 이름을 가져옵니다 println(frequentSender) // [Ma] // Who are the senders? val senders = messages .asSequence() // 작업을 비동기로 만듬 .filter { it.body.isNotBlank() && !it.isRead } // 람다를 사용하거나... .map(Message::sender) // ...멤버 참조를 사용하세요 .distinct() .sorted() .toList() // 시퀸스를 다시 리스트로 변환합니다. println(senders) // [Adam, Ma]}data class Message( // 데이터 클래스 생성 val sender: String, val body: String, val isRead: Boolean = false, // 인수에 기본 값 정의)val messages = listOf( // 리스트 생성 Message("Ma", "Hey! Where are you?"), Message("Adam", "Everything going according to plan today?"), Message("Ma", "Please reply. I've lost you!"),)
각주
외부 링크
- 코틀린 - 공식 웹사이트
- Kotlin Playground - 웹 상에서 코틀린 코드를 실행할 수 있는 사이트