Language/Kotlin

[Kotlin].ch3.코틀린 고급 문법

JSJH._. 2026. 1. 9. 20:39

[Kotlin].ch3. 고급 문법 (람다, 객체, 코루틴)

마지막 코틀린 3장은 고급 문법을 다룹니다. 확실히 이번 ch1,2,3은 java를 알고있다는걸 전제로 안드로이드 코딩을 위해 공부하는것이다 보니 내용이 좀 부실하거나 설명에 많은 누락이 있을수도 있습니다. 그래도 우리가 지금 해야하는건 앱개발 공부니 빠르게 kotlin기초만 잡고 넘어가겠습니다.


고급 문법

타입 체크와 스마트 캐스팅 (is)

코틀린은 자바의 instanceof보더 더 똑똑한 is 연산자를 제공합니다. 타입 검사를 통과하면 개발자가 직접 캐스팅할 필요 없이 컴파일러가 자동으로 형 변환(Smart Cast)을 해줍니다.

// 타입 체크 문법
if (객체 is String) {
    // 이 블록 안에서 '객체'는 자동으로 String으로 캐스팅됩니다.
    println(객체.length) 
}
  • 강제 형변환 (as): 타입을 강제로 변환하며, 실패 시 예외(Exception)가 발생합니다.
  • 안전한 형변환 (as?): 변환에 실패하면 예외 대신 null을 반환하므로 더 안전합니다.
val 변수 = 객체 as String       // 실패하면 앱 죽음 (ClassCastException)
val 변수 = 객체 as? String      // 실패하면 null

제네릭 (<T>)

클래스나 함수 내부에서 사용할 데이터 타입을 외부에서 지정할 수 있게 해주는 기능입니다. 자바의 제네릭과 사용법이 거의 유사합니다.

// 제네릭 클래스
class Box<T>(val value: T)

// 사용 (타입 추론 가능)
val box = Box(10) // T는 Int가 됨

람다와 고차 함수

람다 (Lambda)
함수를 굳이 선언하지 않고 값처럼 식(Expression)으로 전달하는 "이름 없는 함수"입니다.
{ 파라미터 -> 실행할 코드 } 형태로 작성합니다.

고차 함수 (Higher-Order Function)
다른 함수를 파라미터로 받거나, 함수 자체를 반환하는 함수를 말합니다. 코틀린은 함수를 일급 객체로 취급하기 때문에 이것이 가능합니다.

// 람다 식을 변수에 저장
val sum = { x: Int, y: Int -> x + y }

// 고차 함수 활용 (컬렉션 조작)
val list = listOf(1, 2, 3, 4, 5)
val evenList = list.filter { it % 2 == 0 } // 짝수만 필터링하는 람다 전달

익명 객체 (Anonymous Object)

인터페이스나 추상 클래스를 구현한 객체가 일회성으로 필요할 때, 클래스를 따로 만들지 않고 즉석에서 구현할 수 있습니다.
주로 안드로이드에서 리스너(Listener)를 처리할 때 자주 보게 됩니다.

val listener = object : OnClickListener {
    override fun onClick() { 
        println("클릭됨") 
    }
}

싱글톤 패턴: object

자바에서 싱글톤 패턴을 구현하려면 꽤 많은 보일러플레이트 코드가 필요했죠.
코틀린은 object 키워드만 붙이면 클래스 정의와 동시에 유일한 인스턴스가 생성됩니다. 앱 전체에서 공유해야 하는 자원(네트워크 모듈 등)에 사용합니다.

object MySingleton {
    val name = "Singleton"
    fun hello() = println("Hi")
}

// 별도 생성(new) 없이 바로 접근 가능
MySingleton.hello()

코루틴 (suspend)

코틀린 비동기 처리의 핵심이자 꽃입니다.
네트워크 요청이나 DB 작업처럼 시간이 오래 걸리는 작업을 메인 스레드(UI)를 멈추지 않고 처리할 수 있게 해줍니다.

suspend 함수
"잠시 중단(Suspend)했다가 나중에 재개(Resume)할 수 있는 함수"라는 뜻입니다. 코루틴 스코프 내에서만 호출할 수 있으며, 비동기 코드를 마치 동기 코드처럼 직관적으로 짤 수 있게 해줍니다.

suspend fun fetchData(): String {
    delay(1000) // 1초 대기 (스레드는 차단되지 않음)
    return "Data"
}

// 코루틴 실행
scope.launch {
    // fetchData가 끝날 때까지 여기서 기다리지만, 
    // 실제 UI 스레드는 멈추지 않고 계속 돕니다. (Non-blocking)
    val data = fetchData() 
    println(data)
}

저도 아직 개념적으로 모르는게 많아서 이렇게 한번 봐두고 실전을 하면서 몸으로 익히려구요.
감사합니다.

'Language > Kotlin' 카테고리의 다른 글

[Kotlin].ch2. Null 안정성과 클래스  (0) 2026.01.09
[Kotlin].ch1.java 배운 후 배우는 kotlin  (0) 2026.01.08