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 체크를 강제해서 런타임 크래시를 방지한다.
파일 구조

- 하위 폴더를
.으로 구분 - 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)
같은 기능인데 코드 양이 확연히 다르다.
관련 문서
- 2_안드로이드 이해 - Android 아키텍처
- 4_화면 구성 - UI 구성
- dart 3.0 - Dart와 비교