3_코틀린

topics 500-모바일개발 502 Android
types 이론 학습
tags #kotlin #android #programming

Kotlin 기초

Android 개발에서 사용하는 Kotlin의 주요 특징을 정리한다.

왜 Kotlin인가

특징 설명
Java 호환 Java와 100% 상호 운용 가능
Null Safety null 허용/불허용 구분 선언
간결함 Java보다 훨씬 짧은 코드
코루틴 비동기 프로그래밍 간소화

Null Safety

Kotlin의 가장 큰 특징이다. 컴파일 타임에 null 체크를 강제한다.

// null 불허용 (기본)
var name: String = "Kotlin"
name = null  // 컴파일 에러!

// null 허용 (? 붙임)
var nickname: String? = "K"
nickname = null  // OK

// Safe Call
val length = nickname?.length  // null이면 null 반환

// Elvis 연산자
val len = nickname?.length ?: 0  // null이면 0

왜 좋냐면: Java의 NullPointerException 지옥에서 벗어날 수 있다. 컴파일 타임에 null 체크를 강제해서 런타임 크래시를 방지한다.

파일 구조

|449

  • 하위 폴더를 .으로 구분
  • Java와 달리 최상위에 변수, 함수 선언 가능 (클래스로 안 묶어도 됨)
// Utils.kt - 클래스 없이 함수만 정의 가능
package com.example.utils

fun formatDate(date: Date): String {
    // ...
}

val DEFAULT_TIMEOUT = 5000

패키지

  • package는 컴파일 시 만들어지는 클래스 파일 위치
  • 일반적으로 kt 파일 위치와 package 이름을 동일시 (다르게도 가능)
  • 같은 패키지에 있는 변수, 함수, 클래스는 import 없이 사용 가능

주요 문법

변수 선언

val immutable = "변경 불가"  // final
var mutable = "변경 가능"

// 타입 추론
val number = 42       // Int
val pi = 3.14         // Double
val message = "Hi"    // String

함수 정의

// 기본
fun add(a: Int, b: Int): Int {
    return a + b
}

// 단일 표현식
fun add(a: Int, b: Int) = a + b

// 기본값 파라미터
fun greet(name: String = "Guest") = "Hello, $name"

클래스

// 기본 클래스
class User(val name: String, var age: Int)

// Data 클래스 (equals, hashCode, toString, copy 자동 생성)
data class User(val name: String, val age: Int)

// Sealed 클래스
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
}

람다와 고차 함수

// 람다
val sum: (Int, Int) -> Int = { a, b -> a + b }

// 고차 함수
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

// 사용
val result = operate(5, 3) { x, y -> x + y }  // 8

: 마지막 인자가 람다면 소괄호 밖으로 뺄 수 있다.

apply, also, let, run, with

// apply: 객체 설정하고 객체 반환
val user = User().apply {
    name = "Kim"
    age = 25
}

// also: 객체로 뭔가 하고 객체 반환
val user = User("Kim", 25).also {
    println("Created: ${it.name}")
}

// let: null 체크 + 변환
val length = name?.let { it.length } ?: 0

// run: 객체 컨텍스트에서 실행하고 결과 반환
val greeting = user.run { "Hello, $name" }

코루틴

비동기 작업을 동기 코드처럼 작성할 수 있다.

// suspend 함수
suspend fun fetchUser(): User {
    return withContext(Dispatchers.IO) {
        api.getUser()
    }
}

// 사용
viewModelScope.launch {
    val user = fetchUser()  // 비동기지만 동기처럼 보임
    updateUI(user)
}

Java vs Kotlin 비교

// Java
public class User {
    private final String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
// Kotlin
data class User(val name: String, var age: Int)

같은 기능인데 코드 양이 확연히 다르다.

관련 문서