코틀린 (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.

코틀린
패러다임다중 패러다임 (객체 지향, 함수형, 명령형, 선언형, 범용, 블록, 반영, 병행)
설계자젯브레인즈
개발자젯브레인즈
발표일2011년 7월 22일(12년 전)(2011-07-22)
최근 버전1.9.22[1] 위키데이터에서 편집하기
최근 버전 출시일2023년 12월 21일(4개월 전)(2023년 12월 21일)
자료형 체계정적타입, 강타입, 추론적 타입
플랫폼JVM, 자바스크립트, LLVM, 데이터 사이언스
운영 체제크로스 플랫폼
라이선스아파치 라이선스 2.0
파일 확장자
  • .kt
  • .kts
웹사이트kotlinlang.org
영향을 받은 언어

코틀린(영어: Kotlin, IPA: /ˈkɒtlɪn/[2])은 젯브레인즈사에서 개발하는 크로스 플랫폼 범용 프로그래밍 언어로, 자바와 완벽하게 호환되게 설계되었으며 일반적으로 JVM에서 사용되나 자바스크립트, LLVM 그리고 데이터 사이언스 영역에서도 사용 가능하다.

파일 확장자는 일반적으로 .kt를 사용하며 코틀린 스크립트는 .kts를 사용한다.

코틀린은 2019년 5월 7일 이후로 구글의 안드로이드 앱 개발에서 선호하는 언어가 되었다.[3]

역사[편집]

코틀린 마스코트의 2D 사진
코틀린 마스코트의 3D 사진

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!"),
)

각주[편집]

  1. “Release Kotlin 1.9.22”. 
  2. “What is the correct English pronunciation of Kotlin?” (영어). 2016년 10월 19일. 2022년 9월 30일에 확인함. 
  3. “Kotlin is now Google’s preferred language for Android app development”. 《TechCrunch》 (미국 영어). 2019년 5월 8일에 확인함. [깨진 링크(과거 내용 찾기)]
  4. Krill, Paul (2011년 7월 22일). “JetBrains readies JVM language Kotlin”. 《infoworld.com》. InfoWorld. 2014년 2월 2일에 확인함. 
  5. Waters, John (2012년 2월 22일). “Kotlin Goes Open Source”. 《ADTmag.com/》. 1105 Enterprise Computing Group. 2014년 2월 2일에 확인함. 
  6. Mobius (2015년 1월 8일), 《Андрей Бреслав — Kotlin для Android: коротко и ясно》, 2017년 5월 28일에 확인함 
  7. Kieron Murphy (1996년 10월 4일). “So why did they decide to call it Java?”. 2019년 3월 15일에 원본 문서에서 보존된 문서. 2017년 10월 14일에 확인함. 
  8. “Why JetBrains needs Kotlin”. we expect Kotlin to drive the sales of IntelliJ IDEA 
  9. “Kotlin 1.0 Released: Pragmatic Language for JVM and Android | Kotlin Blog”. 《Blog.jetbrains.com》. 2016년 2월 15일. 2017년 4월 11일에 확인함. 
  10. Shafirov, Maxim (2017년 5월 17일). “Kotlin on Android. Now official”. Today, at the Google I/O keynote, the Android team announced first-class support for Kotlin. 
  11. https://kotlinlang.org/docs/android-overview.html
  12. https://twitter.com/jmslau/status/1087827632752738304
  13. “Kotlin 1.0 Released: Pragmatic Language for the JVM and Android”. 《The Kotlin Blog》 (미국 영어). 2023년 3월 10일에 확인함. 
  14. “What's new in Kotlin 1.1”. 《Kotlin》 (미국 영어). 2023년 3월 10일에 확인함. 
  15. “What's new in Kotlin 1.2”. 《Kotlin》 (미국 영어). 2023년 3월 10일에 확인함. 
  16. “Kotlin releases”. 《Kotlin》 (미국 영어). 2023년 3월 10일에 확인함. 
  17. “Kotlin 1.9.0 릴리스 | The Kotlin Blog”. 2023년 7월 26일. 2023년 12월 27일에 확인함. 
  18. “K2 컴파일러가 Kotlin 2.0에서 안정화됩니다”. 《The Kotlin Blog》. 2023년 3월 10일에 확인함. 
  19. “New Release Cadence for Kotlin and the IntelliJ Kotlin Plugin”. 《The Kotlin Blog》 (미국 영어). 2023년 3월 10일에 확인함. 
  20. “Kotlin/JS dead code elimination” (미국 영어). 2022년 10월 4일에 확인함. 

외부 링크[편집]