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

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

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

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

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

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

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

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

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

문법

일반적인 사용법 
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")
}

객체 지향 
bstract 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 - 웹 상에서 코틀린 코드를 실행할 수 있는 사이트

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