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

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

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

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

## 역사
섬네일|upright=0.5|코틀린 마스코트의 2D 사진
섬네일|upright=0.5|코틀린 마스코트의 3D 사진
2011년 7월, 젯브레인즈는 1년 간 개발되고 있던, JVM의 새로운 언어인 프로젝트 코틀린을 공개하였다. 젯브레인즈의 개발을 주도하던 드미트리(Dmitry Jemerov)는 스칼라를 제외한 대부분의 언어들에는 찾고자 하던 기능이 존재하지 않았다고 언급하였다. 그러나 스칼라의 느린 컴파일 시간을 단점으로 지적하였다. 코틀린의 언급된 목표들 가운데 하나는 자바만큼 빠르게 컴파일하는 것이다. 2012년 2월, 젯브레인즈는 이 프로젝트를 아파치 2 라이선스로 오픈 소스화했다.

코틀린이라는 이름은 코틀린섬에서 비롯된 것이다. Andrey Breslav는 팀이 이 이름을 결정하게 된 이유로는 자바가 인도네시아의 자와섬에서 이름을 가져왔듯, 코틀린도 똑같이 코틀린섬에서 이름을 가져오기로 한 것에서 비롯된다.(그러나 프로그래밍 언어 자바는 커피 '자바'에서 이름을 가져온 것으로 추정된다)

젯브레인즈는 이 새로운 언어가 IntelliJ IDEA 판매를 상승시켜주길 희망하였다.

코틀린 v1.0은 2016년 2월 15일 출시되었다. 이는 최초의 공식 안정판으로 간주되며 젯브레인즈는 이 버전을 기점으로 장기간의 하위 호환성을 약속하였다.

구글 I/O 2017에서 구글은 안드로이드에서 코틀린이 공식 지원 언어에 추가 되었으며 2019년부터는 안드로이드 개발을 위한 공식 언어로 지정되었다.

### 버전 정보

#### 출시 주기
기존 코틀린은 로드맵의 기능이 모두 준비가 완료되어야 출시하는 방식을 사용하였는데 1.4 버전이 출시에 2년 가까이 걸리게 되자 1.5 버전 이후 부터는 새로운 릴리즈 주기를 도입하였다.

#### 기능 릴리즈 (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 등 자바스크립트 엔진에서 작동하기 위한 런타임 및 컴파일러로 타입스크립트 타입 정의 파일을 감지, 생성할 수 있고 사용하지 않는 코틀린 표준 라이브러리에서 사용되지 않는 코드를 제거하는 플러그인이 내장되어 있다.

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

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

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

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

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

## 문법
### 일반적인 사용법

```kotlin
fun main() {
    val name = "stranger"        // 첫번째 변수 선언
    println("Hi, $name!")        // ...그리고 사용!
    print("Current count:")
    for (i in 0..10) {           // 0에서 10까지 반복
        print(" $i")
    }
}
```


### 비동기 코드

```kotlin
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** 라이브러리를 따로 설치해야한다.

### 객체 지향

```kotlin
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) //인터페이스에서 기본 정의된 함수
}
```


### 함수형

```kotlin
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 - 웹 상에서 코틀린 코드를 실행할 수 있는 사이트

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