[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 |