기초
변수 & 타입
var(가변)보다 val(불변)을 선호. Kotlin은 타입을 추론하지만 명시적 어노테이션 허용. 타입 확인에는 'is' 사용(자동 스마트 캐스트). 모든 것이 객체—Kotlin 구문에 프리미티브 없음.
val name = "Alice" // immutable (preferred)
var age = 30 // mutable
val pi: Double = 3.14159
val isDev: Boolean = true
val nums: List<Int> = listOf(1, 2, 3)
println(name::class) // class kotlin.String
println(age is Int) // true문자열 템플릿
단순 변수는 $var, 표현식은 ${expr}. 삼중 따옴표 문자열은 줄바꿈 보존—깔끔한 포맷팅을 위해 trimIndent() 사용. 문자열 템플릿이 포맷 문자열 없이 문자열 빌드를 간결하고 읽기 쉽게 만듭니다.
val name = "Alice"
val age = 30
println("Name: $name, Age: $age") // simple var
println("Length: ${name.length}") // expression
println("Upper: ${name.uppercase()}")
val multiline = """
Hello, $name
Age: $age
""".trimIndent()Null 안전
Kotlin의 null 안전: ?가 nullable 타입 표시, ?. 안전 호출(null이면 null 반환), !!가 non-null 단언(null이면 NPE throw), ?: elvis(null이면 기본값). 컴파일 타임에 NullPointerException 제거—Kotlin 핵심 기능.
var name: String? = null // nullable type
println(name?.length) // null (safe call)
name = "Alice"
println(name!!.length) // 5 (non-null assertion)
val len: Int = name?.length ?: 0 // elvis operator
// Non-null types can never be null
val s: String = "hi" // not nullable타입 변환
Kotlin은 명시적 타입 변환 필요(Java 같은 암시적 확장 없음). 변환에 toInt()/toDouble()/toString() 사용. toIntOrNull()은 실패 시 null 반환—throw하는 toInt()보다 안전. 파싱의 null을 항상 처리하세요.
val n: Int = 42
val d: Double = n.toDouble()
val s: String = n.toString()
val fromStr: Int? = "100".toIntOrNull()
val invalid: Int? = "abc".toIntOrNull() // null
println(d, s, fromStr, invalid)타입 확인 & 스마트 캐스트
is가 타입 확인하고 해당 분기에서 변수를 스마트 캐스트—명시적 캐스트 불필요. !is는 부정. 안전하지 않은 캐스트에는 as(ClassCastException throw), 안전한 캐스트에는 as?(실패 시 null 반환) 사용. 스마트 캐스트는 주요 Kotlin 편의 기능.
fun describe(x: Any): String =
when (x) {
is Int -> "Int: ${x + 1}" // x smart-cast to Int
is String -> "String of length ${x.length}"
is List<*> -> "List with ${x.size} items"
else -> "Unknown"
}
println(describe(42)) // Int: 43
println(describe("hello")) // String of length 5문자열
일반적인 문자열 메서드
Kotlin 문자열은 표준 라이브러리의 풍부한 확장 함수 가짐. 대부분 새 문자열 반환(불변). 수동 루프 대신 사용. uppercase() 같은 함수는 로케일 인식—일관된 결과를 위해 uppercase(Locale.ROOT) 사용.
val s = "Hello, World"
println(s.length) // 12
println(s.uppercase()) // HELLO, WORLD
println(s.lowercase()) // hello, world
println(s.split(", ")) // [Hello, World]
println(s.replace("o", "0")) // Hell0, W0rld
println(s.reversed()) // dlroW ,olleH
println(s.startsWith("Hello")) // true여러 줄 & Raw 문자열
삼중 따옴표 문자열은 raw—이스케이프 시퀀스 불필요(삼중 큰따옴표 제외). trimMargin('|')가 | 이후의 텍스트만 유지하여 깔끔한 들여쓰기. trimIndent()가 공통 공백 제거. SQL, JSON, HTML에 이상적.