💻 프로그래밍

Kotlin

Kotlin Language

JetBrains가 개발한 JVM 언어. Android 공식 언어. Java와 100% 호환. 간결한 문법.

📖 상세 설명

Kotlin은 2011년 JetBrains에서 발표하고 2016년 정식 출시한 현대적인 프로그래밍 언어입니다. JVM(Java Virtual Machine)에서 실행되며, Java의 장황한 문법과 null 관련 버그를 해결하기 위해 설계되었습니다. "더 나은 Java"를 목표로 만들어진 언어로, 기존 Java 코드와 완벽하게 호환됩니다.

2017년 Google I/O에서 Android의 공식 지원 언어로 발표되었고, 2019년에는 Android 개발의 우선 언어(Kotlin-first)로 지정되었습니다. 현재 신규 Android 앱의 80% 이상이 Kotlin으로 작성되며, Pinterest, Netflix, Uber, Slack 등 글로벌 기업들이 Kotlin을 적극 채택하고 있습니다.

Kotlin의 핵심 특징은 null 안전성(Null Safety), 확장 함수, 데이터 클래스, 코루틴(Coroutines) 기반 비동기 프로그래밍입니다. 특히 컴파일 타임에 NullPointerException을 방지하는 타입 시스템은 Java에서 가장 흔한 런타임 오류를 원천 차단합니다.

Kotlin은 JVM뿐 아니라 JavaScript로 트랜스파일하는 Kotlin/JS, 네이티브 바이너리를 생성하는 Kotlin/Native를 지원합니다. Kotlin Multiplatform을 통해 Android, iOS, 웹, 서버, 데스크톱에서 비즈니스 로직을 공유할 수 있어, 크로스 플랫폼 개발의 새로운 패러다임을 열었습니다.

💻 코드 예제

// 1. Null Safety - 컴파일 타임 null 체크
fun getUserName(user: User?): String {
    // Elvis 연산자와 safe call
    return user?.name ?: "익명 사용자"
}

// 2. 데이터 클래스 - 보일러플레이트 코드 제거
data class User(
    val id: Long,
    val name: String,
    val email: String
)

// equals, hashCode, toString, copy 자동 생성
val user1 = User(1, "홍길동", "hong@example.com")
val user2 = user1.copy(name = "김철수")

// 3. 확장 함수 - 기존 클래스에 함수 추가
fun String.addExclamation(): String = "$this!"
println("안녕하세요".addExclamation()) // 출력: 안녕하세요!

// 4. 코루틴 - 비동기 프로그래밍
import kotlinx.coroutines.*

suspend fun fetchUserData(userId: Long): User {
    return withContext(Dispatchers.IO) {
        // 네트워크 요청 시뮬레이션
        delay(1000)
        User(userId, "사용자$userId", "user$userId@example.com")
    }
}

fun main() = runBlocking {
    val users = listOf(1L, 2L, 3L).map { id ->
        async { fetchUserData(id) }
    }.awaitAll()

    users.forEach { println("${it.name}: ${it.email}") }
}

// 5. 컬렉션 처리 - 함수형 스타일
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = numbers
    .filter { it % 2 == 0 }    // 짝수: [2, 4, 6, 8, 10]
    .map { it * it }            // 제곱: [4, 16, 36, 64, 100]
    .sum()                      // 합계: 220

println("짝수 제곱의 합: $result")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"신규 Android 앱은 Kotlin으로 개발하겠습니다. null 안전성 덕분에 NPE 관련 크래시를 90% 이상 줄일 수 있고, 코루틴으로 비동기 처리도 훨씬 깔끔하게 작성할 수 있어요. 기존 Java 라이브러리도 그대로 사용 가능합니다."
💬 면접에서
"Kotlin의 코루틴은 경량 스레드로, suspend 함수를 통해 비동기 코드를 동기 코드처럼 작성할 수 있습니다. Dispatcher를 통해 실행 컨텍스트를 제어하고, structured concurrency로 코루틴의 생명주기를 관리합니다. RxJava 대비 학습 곡선이 낮고 가독성이 좋습니다."
💬 코드 리뷰에서
"이 부분에서 !! 연산자(not-null assertion)를 쓰고 있는데, 런타임에 NPE가 발생할 수 있어요. safe call(?.)과 Elvis 연산자(?:)로 대체하거나, require/check 함수로 명시적으로 검증해주세요."

⚠️ 흔한 실수 & 주의사항

!! 연산자 남용 금지

!! 연산자는 null이 아님을 강제 단언하지만, null인 경우 NPE가 발생합니다. Kotlin의 null 안전성을 무력화하는 것이므로 가능한 ?. ?:로 대체하세요.

코루틴 스코프 관리 실수

GlobalScope는 앱 생명주기 동안 유지되어 메모리 누수를 일으킬 수 있습니다. ViewModel의 viewModelScope나 lifecycleScope처럼 생명주기에 맞는 스코프를 사용하세요.

data class 적극 활용

equals, hashCode, toString, copy 메서드가 자동 생성되어 보일러플레이트를 크게 줄입니다. DTO, Entity 등 데이터 홀더 클래스에 적극 활용하세요.

🔗 관련 용어

📚 더 배우기