Kotlin

Kotlin 이란

재심 2024. 10. 3. 20:14

2011년 IntelliJ IDEA를 개발하면 JetBrains에서 JVM기반의 새로운 언어에 도전하였다.

자바가 인도네시아의 섬이름에서 유래한 것에 착안해서 러시아의 섬이름을 따와서 코틀린으로 정했다고 한다.

 

문법이 간결하고 자바와의 호환성이 뛰어나 인기를 점점 끌기 시작했고, 구글이 안드로이드 개발을 위한 공식언어로 채택하면서 더욱 인기가 높아졌다고 한다.

 

그 동안 JVM 기반의 언어는 많이 등장했으나 자바의 아성을 위협하진 못했다고 한다.

하지만 코틀린의 경우 백엔드 개발까지도 앞으로 자바를 뛰어넘는 JVM 기반의 주류 언어가 될 것이 확실시 되는 상황.

 

코틀린의 주요 특징

실용성

코틀린은 학교나 연구소의 연구를 위한 언어가 아닌 실무의 문제를 해결하기 위해 만든 언어이다.

대규모 시스템을 개발해본 IT업계 경험을 바탕으로 언어가 설계되었기 때문에 실무 영역에서의 많은 문제를 해결한다고 한다.

 

또한 탄생 자체가 JetBrain에서 만들었기 때문에 IntelliJ와 함께 발전하고 있어서 언어와 도구가 함께 발전하고 있다.

 

간결한 문법

불필요한 코드를 줄이고 읽기 쉬운 코드를 제공.

아래 코드를 통해 getter, setter까지 모두 생성된다.

class Person(val name: String, var age: Int)

 

NULL 안정성 (NULL Safety)

코틀린은 null 안정성을 지원한다. 기본적으로 모든 변수는 null을 허용하지 않는데, null을 허용하려면 뒤에 ?를 붙어야 한다.

즉, 언어의 구조가 개발자가 실수할 가능성을 원천적으로 방지해 오류를 줄여준다는 의미이다.

 

var name: String = "Kotlin"    // null 불가
var nullableName: String? = null // null 허용

 

자바에서 가장 흔한 에러 중 하나가 NPE이다. 근데 코틀린에서는 NULL이 될 수 있고, 없고를 정해놓아서 원천적으로 NULL을 넘기지 못하도록 한다.

 

아래 코드의 경우 오류가 발생한다. s.length에서 NULL이 될 수 없으니 ?를 붙이든가 !!를 통해 NULL아님 단언을 해주던가 해야한다.

fun strLen(s: String?): Int {
	return s.length
}

 

?로 해결해본다. 하지만 이 때도 오류가 발생한다.

fun strLen(s: String?): Int {
	return s?.length
}

그 이유는 리턴 타입에도 Int가 아닌 Int? 해줘야 한다.

fun strLen(s: String?): Int? {
	return s?.length
}

 

여기까지 수정했지만 단지 함수에서 NULL처리를 한 것이다. 그래서 바깥에서도 NULL처리를 결국해줘야 한다.

하지만 !!를 통해 NULL 아님 단언을 해주면 바깥에서도 NULL처리를 해주지 않아도 된다.

fun strLen(s: String?): Int? {
	return s!!.length
}

 

하지만 이렇게되면 NULL이 들어왔을 때 NPE가 발생하는 것을 막을 수 없다. 결국 NULL이 들어오는 가능성이 있으면 NULL처리를 해주는 것이 좋다.

fun strLen(s: String?): Int? {
	return if (s== null) 0 else s.length
}

 

확장 함수 (Extension Functions)

 코틀린은 기존 클래스에 새로운 메서드를 추가할 수 있는 확장함수 기능을 제공한다.

기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있게 된다.

fun String.addExclamation() = this + "!"
val result = "Hello".addExclamation() // "Hello!"

 

고차 함수 (Higer-Order Function)

고차 함수를 지원한다는 건 함수를 매개변수로 전달하거나 반환할 수 있다는 의미이다. 이를 통해 함수형 프로그래밍 스타일을 소화할 수 있게 된다.

fun applyOperation(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}
val sum = applyOperation(3, 4, { x, y -> x + y }) // 7

 

데이터 클래스 (Data Class)

data class로 정의하면 equals(), hashCode(), toString() 메서드를 자동으로 만들어준다.

data class User(val name: String, val age: Int)

 

스마트 캐스팅 (Smart Casting)

코틀린은 타입 검사 후 변수의 타입을 자동으로 캐스팅 해줘서 명시적인 캐스팅 없이도 변수를 사용할 수 있게 해준다.

fun printLength(obj: Any) {
    if (obj is String) {
        println(obj.length) // 자동으로 String으로 캐스팅됨
    }
}

 

코루틴 (Coroutines)

코틀린은 비동기 프로그래밍을 쉽게 처리할 수 있는 코루틴을 제공한다고 한다. 코루틴은 경량 스레드로 비동기 코드를 작성하는데 매우 유용하다고 한다.

 

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("World!")
    }
    println("Hello,")
}

 

모듈 시스템 (Module System)

코틀린은 코드를 여러 패키지나 모듈로 나눌 수 있다고 한다. 이를 통해 코드 구조를 개선하고 재사용성을 높일 수 있다고 한다.

 

Java 와의 호환성

코틀린은 자바와 완벽하게 호환된다.

'Kotlin' 카테고리의 다른 글

코틀린이 제공하는 자료형  (0) 2024.10.05
코틀린의 실행 과정  (0) 2024.10.03
코틀린의 접근 제어  (0) 2024.10.03
코틀린의 기본 문법 정리  (0) 2024.10.03