{{위키데이터 속성 추적}}
{{Infobox programming language
| name = 코틀린
| logo = Kotlin logo 2021.svg
| paradigm = [[다중 패러다임 프로그래밍 언어|다중 패러다임]] ([[객체 지향 프로그래밍|객체 지향]], [[함수형 프로그래밍|함수형]], [[명령형 프로그래밍|명령형]], [[선언형 프로그래밍|선언형]], [[범용 프로그래밍 언어|범용]], [[블록 (프로그래밍)|블록]], [[반영 (컴퓨터 과학)|반영]], [[병행 컴퓨팅|병행]])
| family = 
| released = {{시작 날짜와 나이|2011|07|22|df=no}}
| designer = [[젯브레인즈]]
| developer = [[젯브레인즈]]
| latest release version = {{wikidata|property|reference|edit|P348}}
| latest release date = {{시작 날짜와 나이|{{wikidata|qualifier|P348|P577}}|df=no}}
| typing = [[자료형 체계#정적 정형|정적타입]], [[자료형 체계#강한 정형|강타입]], 추론적 타입
| implementations = 
| dialects = 
| influenced by = {{Hlist|[[C 샤프|C#]]|[[Gosu]]|[[아파치 그루비|그루비]]|[[자바 (프로그래밍 언어)|자바]]|[[ML (프로그래밍 언어)|ML]]|[[파이썬]]|[[스칼라 (프로그래밍 언어)|스칼라]]}}
| platform = [[자바 가상 머신|JVM]], [[자바스크립트]], [[LLVM]], [[데이터 사이언스]]
| operating system = [[크로스 플랫폼]]
| license = [[아파치 라이선스 2.0]]
| file_ext = {{기호없는 목록|.kt|.kts}}
| wikibooks = 
| caption = 
}}
'''코틀린'''({{Llang|en|Kotlin}}, IPA: /ˈkɒtlɪn/<ref>{{웹 인용|url=https://discuss.kotlinlang.org/t/what-is-the-correct-english-pronunciation-of-kotlin/2050|제목=What is the correct English pronunciation of Kotlin?|날짜=2016-10-19|언어=en|확인날짜=2022-09-30}}</ref>)은 [[젯브레인즈]]사에서 개발하는 [[크로스 플랫폼]] [[범용 프로그래밍 언어]]로, [[자바 (프로그래밍 언어)|자바]]와 완벽하게 호환되게 설계되었으며 일반적으로 [[JVM]]에서 사용되나 [[자바스크립트]], [[LLVM]] 그리고 [[데이터 사이언스]] 영역에서도 사용 가능하다.

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

코틀린은 2019년 5월 7일 이후로 구글의 안드로이드 앱 개발에서 선호하는 언어가 되었다.<ref>{{웹 인용|url=http://social.techcrunch.com/2019/05/07/kotlin-is-now-googles-preferred-language-for-android-app-development/|title=Kotlin is now Google’s preferred language for Android app development|website=TechCrunch|language=en-US|access-date=2019-05-08|archive-date=2020-06-17|archive-url=https://archive.today/20200617201052/http://social.techcrunch.com/2019/05/07/kotlin-is-now-googles-preferred-language-for-android-app-development/|url-status=}}</ref>

== 역사 ==
[[파일:Kotlin Mascot 2D no. 1.svg|섬네일|upright=0.5|코틀린 마스코트의 2D 사진]]
[[파일:Kotlin Mascot 3D no. 5.png|섬네일|upright=0.5|코틀린 마스코트의 3D 사진]]
2011년 7월, [[젯브레인즈]]는 1년 간 개발되고 있던, JVM의 새로운 언어인 프로젝트 코틀린을 공개하였다.<ref name="announce">{{웹 인용|url = https://www.infoworld.com/d/application-development/jetbrains-readies-jvm-based-language-167875 |publisher = InfoWorld |website = infoworld.com |first = Paul |last = Krill |title = JetBrains readies JVM language Kotlin |date = 22 July 2011 |accessdate = 2 February 2014 }}</ref> 젯브레인즈의 개발을 주도하던 드미트리(Dmitry Jemerov)는 [[스칼라 (프로그래밍 언어)|스칼라]]를 제외한 대부분의 언어들에는 찾고자 하던 기능이 존재하지 않았다고 언급하였다. 그러나 스칼라의 느린 [[컴파일]] 시간을 단점으로 지적하였다.<ref name="announce"/> 코틀린의 언급된 목표들 가운데 하나는 자바만큼 빠르게 컴파일하는 것이다. 2012년 2월, 젯브레인즈는 이 프로젝트를 [[아파치 라이선스|아파치 2 라이선스]]로 오픈 소스화했다.<ref name="open source">{{웹 인용|url = https://adtmag.com/articles/2012/02/22/kotlin-goes-open-source.aspx |title = Kotlin Goes Open Source |first = John |last = Waters |date = 22 February 2012 |accessdate = 2 February 2014 |website = ADTmag.com/ |publisher = 1105 Enterprise Computing Group }}</ref>

코틀린이라는 이름은 [[코틀린섬]]에서 비롯된 것이다. Andrey Breslav는 팀이 이 이름을 결정하게 된 이유로는 자바가 인도네시아의 [[자와섬]]에서 이름을 가져왔듯, 코틀린도 똑같이 코틀린섬에서 이름을 가져오기로 한 것에서 비롯된다.<ref>{{인용|last=Mobius|title=Андрей Бреслав — Kotlin для Android: коротко и ясно|date=8 January 2015|url=https://www.youtube.com/watch?v=VU_L2_XGQ9s|accessdate=28 May 2017}}</ref>(그러나 프로그래밍 언어 자바는 커피 '자바'에서 이름을 가져온 것으로 추정된다)<ref>{{웹 인용|author=Kieron Murphy|title=So why did they decide to call it Java?|url=https://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html|date=4 October 1996|archive-url=https://web.archive.org/web/20190315171946/http://www.javaworld.com/article/2077265/so-why-did-they-decide-to-call-it-java-.html|archive-date=15 March 2019|url-status=live|access-date=14 October 2017}}</ref>

젯브레인즈는 이 새로운 언어가 [[IntelliJ IDEA]] 판매를 상승시켜주길 희망하였다.<ref>{{웹 인용|url = https://blog.jetbrains.com/kotlin/2011/08/why-jetbrains-needs-kotlin/ |title = Why JetBrains needs Kotlin |quote = we expect Kotlin to drive the sales of IntelliJ IDEA }}</ref>

코틀린 v1.0은 2016년 2월 15일 출시되었다.<ref>{{웹 인용|url = https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/ |title = Kotlin 1.0 Released: Pragmatic Language for JVM and Android &#124; Kotlin Blog |website = Blog.jetbrains.com |date = 15 February 2016 |accessdate = 11 April 2017 }}</ref> 이는 최초의 공식 안정판으로 간주되며 젯브레인즈는 이 버전을 기점으로 장기간의 하위 호환성을 약속하였다.

[[구글 I/O]] 2017에서 구글은 [[안드로이드 (운영 체제)|안드로이드]]에서 코틀린이 공식 지원 언어에 추가 되었으며<ref name="kotlin-android">{{웹 인용|url = https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/ |title = Kotlin on Android. Now official |first = Maxim |last = Shafirov |quote = Today, at the Google I/O keynote, the Android team announced first-class support for Kotlin. |date = 17 May 2017 }}</ref> 2019년부터는 안드로이드 개발을 위한 공식 언어로 지정되었다.<ref>https://kotlinlang.org/docs/android-overview.html</ref><ref>https://twitter.com/jmslau/status/1087827632752738304</ref>

=== 버전 정보 ===
{| class="wikitable sortable"
|+
!버전
!출시일
!주요 변경 사항
|-
|1.0
|2016년 2월 14일<ref>{{웹 인용|url=https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/|제목=Kotlin 1.0 Released: Pragmatic Language for the JVM and Android|웹사이트=The Kotlin Blog|언어=en-US|확인날짜=2023-03-10}}</ref>
|정식 버전 (안정화 버전) 출시
|-
|1.1
|2016년 2월 15일<ref>{{웹 인용|url=https://kotlinlang.org/docs/whatsnew11.html|제목=What's new in Kotlin 1.1|웹사이트=Kotlin|언어=en-US|확인날짜=2023-03-10}}</ref>
|Kotlin/JS 안정화 버전
|-
|1.2
|2017년 11월 27일<ref>{{웹 인용|url=https://kotlinlang.org/docs/whatsnew12.html|제목=What's new in Kotlin 1.2|웹사이트=Kotlin|언어=en-US|확인날짜=2023-03-10}}</ref>
|Kotlin/Multiplatform 실험 버전 출시<br />[[JVM]]과 [[자바스크립트]]간의 코드 공유 기능 추가
|-
|1.3
|2018년 10월 29일<ref name=":0">{{웹 인용|url=https://kotlinlang.org/docs/releases.html|제목=Kotlin releases|웹사이트=Kotlin|언어=en-US|확인날짜=2023-03-10}}</ref>
|[[코루틴]] 지원 추가
|-
|1.4.0
|2020년 8월 17일<ref name=":0" />
|[[오브젝티브-C]] 및 [[스위프트 (프로그래밍 언어)|스위프트]] 지원 추가<br />Kotlin/Multiplatform 알파 버전 출시
|-
|1.5.0
|2021년 5월 5일<ref name=":0" />
|자바 레코드 클래스 지원 추가<br />serial 클래스 지원 추가<br />신규 IR 컴파일러 공개
|-
|1.6.0
|2021년 11월 16일<ref name=":0" />
|Kotlin/Native 신규 메모리 관리자 추가<br />Duration API 안정화
|-
|1.7.0
|2022년 6월 9일<ref name=":0" />
|코틀린 K2 컴파일러 알파 버전 공개<br />Gradle 증분 빌드 시 새로운 접근 방법 적용
|-
|1.8.0
|2022년 12월 28일<ref name=":0" />
|kotlin-reflect 성능 개선<br />[[오브젝티브-C]] 및 [[스위프트 (프로그래밍 언어)|스위프트]] 상호운용성 개선
|-
|1.9.0
|2023년 7월 26일<ref>{{웹 인용|url=https://blog.jetbrains.com/ko/kotlin/2023/07/kotlin-1-9-0-released/|제목=Kotlin 1.9.0 릴리스 {{!}} The Kotlin Blog|날짜=2023-07-26|언어=ko-KR|확인날짜=2023-12-27}}</ref>
|코틀린 K2 컴파일러 베타 버전 업데이트
열거형 클래스 값 함수의 대체 안정화
|-
|2.0.0
|?<ref>{{웹 인용|url=https://blog.jetbrains.com/ko/kotlin/2023/02/k2-kotlin-2-0/|제목=K2 컴파일러가 Kotlin 2.0에서 안정화됩니다|웹사이트=The Kotlin Blog|언어=ko-KR|확인날짜=2023-03-10}}</ref>
|코틀린 K2 컴파일러 안정화
|}

==== 출시 주기 ====
기존 코틀린은 로드맵의 기능이 모두 준비가 완료되어야 출시하는 방식을 사용하였는데 1.4 버전이 출시에 2년 가까이 걸리게 되자 1.5 버전 이후 부터는 새로운 릴리즈 주기를 도입하였다.<ref>{{웹 인용|url=https://blog.jetbrains.com/kotlin/2020/10/new-release-cadence-for-kotlin-and-the-intellij-kotlin-plugin/|제목=New Release Cadence for Kotlin and the IntelliJ Kotlin Plugin|웹사이트=The Kotlin Blog|언어=en-US|확인날짜=2023-03-10}}</ref>

==== 기능 릴리즈 (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]] 등 [[자바스크립트 엔진]]에서 작동하기 위한 [[런타임]] 및 [[컴파일러]]로 [[타입스크립트]] 타입 정의 파일을 감지, 생성할 수 있고 사용하지 않는 코틀린 표준 라이브러리에서 사용되지 않는 코드를 제거하는 플러그인이 내장되어 있다.<ref>{{웹 인용|url=https://kotlinlang.org/docs/javascript-dce.html|제목=Kotlin/JS dead code elimination|언어=en-US|확인날짜=2022-10-04}}</ref>

[[자바스크립트]]와의 [[상호운용성]]을 보장한다.

=== Kotlin/Native ===
코틀린으로 [[응용 소프트웨어]] 및 [[모바일 응용 소프트웨어]] 개발을 위한 [[런타임]] 및 [[컴파일러]]로 [[LLVM]]을 기반으로 작동한다.

[[마이크로소프트 윈도우]], [[리눅스]], [[Mac OS]], [[iOS]] [[응용 소프트웨어]] 개발 및 [[웹어셈블리]] 개발에 사용된다.

[[C]], [[오브젝티브-C]] 그리고 코코아팟의 [[상호운용성]]을 보장한다.

=== Kotlin/Multiplatform ===
코틀린으로 [[크로스 플랫폼]] 개발을 위한 [[런타임]] 및 [[컴파일러]]로 라이브러리, 백엔드 서버, 웹, 데스트탑 앱([[마이크로소프트 윈도우]], [[리눅스]], [[Mac OS]]) 모바일 앱([[iOS]], [[안드로이드 (운영체제)|안드로이드]]) 개발에 사용된다.

== 문법 ==
=== 일반적인 사용법 ===
<syntaxhighlight lang="kotlin" line="1">
fun main() {
    val name = "stranger"        // 첫번째 변수 선언
    println("Hi, $name!")        // ...그리고 사용!
    print("Current count:")
    for (i in 0..10) {           // 0에서 10까지 반복
        print(" $i")
    }
}
</syntaxhighlight>

=== 비동기 코드 ===
<syntaxhighlight lang="kotlin" line="1">
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")
}
</syntaxhighlight>

* 비동기 코드 작성을 위해서 '''kotlinx.coroutines''' 라이브러리를 따로 설치해야한다.

=== 객체 지향 ===
<syntaxhighlight lang="kotlin" line="1">
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) //인터페이스에서 기본 정의된 함수
}
</syntaxhighlight>

=== 함수형 ===
<syntaxhighlight lang="kotlin" line="1">
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!"),
)
</syntaxhighlight>

== 같이 보기 ==
* [[프로그래밍 언어의 비교]]
== 각주 ==
{{각주}}

== 외부 링크 ==
* {{공식 웹사이트}}
* [https://play.kotlinlang.org/ Kotlin Playground] - 웹 상에서 코틀린 코드를 실행할 수 있는 사이트

{{프로그래밍 언어}}
{{자바 (소프트웨어 플랫폼)}}

[[분류:자바 플랫폼]]
[[분류:JVM 프로그래밍 언어]]
[[분류:객체 지향 프로그래밍 언어]]
[[분류:프로그래밍 언어]]
[[분류:2011년 개발된 프로그래밍 언어]]
[[분류:자바 프로그래밍 언어 계열]]
[[분류:자유 소프트웨어 프로젝트]]
[[분류:아파치 라이선스 소프트웨어]]
[[분류:정적 타입 프로그래밍 언어]]
[[분류:다중 패러다임 프로그래밍 언어]]
[[분류:함수형 프로그래밍 언어]]
[[분류:명령형 프로그래밍 언어]]
[[분류:선언형 프로그래밍 언어]]
[[분류:고급 프로그래밍 언어]]