Table of contents
val과 var
Java에서 Kotlin으로 넘어오면 가장 먼저 부딪히는 게 변수 선언이다. int x = 1 대신 val이나 var를 골라야 한다.
fun main() {
val name = "Kotlin" // 한 번 정하면 못 바꿈
var count = 0 // 나중에 바꿀 수 있음
count = 1 // OK
// name = "Java" // 컴파일 에러
}
val은 한 번 할당하면 끝, var은 나중에 다른 값을 넣을 수 있다.
왜 이렇게 나눠뒀을까? 값이 안 바뀐다는 보장이 있으면 코드를 읽을 때 추적할 게 줄어든다. 멀티스레드에서도 동기화 걱정이 없고, 함수형 프로그래밍 스타일과도 잘 맞는다. IntelliJ에서 var를 쓰면 “이거 val로 바꿔도 되지 않나?”라고 경고를 띄워주기도 한다.
실무에서의 원칙은 단순하다. 일단 val로 선언하고, 정말 변경이 필요할 때만 var로 바꾼다.
타입 추론
Kotlin은 타입을 직접 안 써도 알아서 추론해준다.
val message = "Hello" // String
val number = 42 // Int
val pi = 3.14 // Double
명시적으로 쓸 수도 있다. 선언과 동시에 값을 넣지 않을 때는 타입을 꼭 써줘야 한다.
val name: String
name = "Kotlin"
Java에서 var가 10버전부터 생긴 걸 생각하면, Kotlin은 처음부터 타입 추론을 기본으로 설계한 셈이다.
기본 타입
Kotlin에서는 모든 게 객체다. Java처럼 int와 Integer가 따로 있지 않고, Int 하나로 통일되어 있다. 컴파일러가 알아서 최적화해주기 때문에 성능 걱정은 필요 없다.
val age: Int = 25
val height: Double = 175.5
val initial: Char = 'K'
val isActive: Boolean = true
val big: Long = 100_000_000L // 밑줄로 자릿수 구분
100_000_000L처럼 밑줄을 넣을 수 있는 건 작은 기능인데 실제로 꽤 편하다. 금액이나 큰 숫자를 다룰 때 자릿수를 한눈에 파악할 수 있기 때문이다.
Nullable 타입
Kotlin에서 가장 칭찬받는 기능 중 하나가 Nullable 시스템이다. Java 개발자라면 NullPointerException에 시달려본 경험이 있을 텐데, Kotlin은 이걸 컴파일 타임에 잡아준다.
기본적으로 모든 타입은 null을 허용하지 않는다.
var name: String = "Kotlin"
// name = null // 컴파일 에러
null이 필요하면 타입 뒤에 ?를 붙여서 명시적으로 허용해야 한다.
var name: String? = "Kotlin"
name = null // OK
// name.length // 컴파일 에러 — null일 수 있으니까
println(name?.length) // 안전 호출 — null이면 null 반환
println(name?.length ?: 0) // Elvis 연산자 — null이면 0
?.은 안전 호출 연산자다. 값이 null이면 뒤의 메서드를 호출하지 않고 null을 반환한다. ?:은 Elvis 연산자로, 왼쪽이 null일 때 오른쪽 값을 대신 쓴다.
처음에는 ?를 여기저기 붙이는 게 번거롭게 느껴질 수 있는데, 한번 익숙해지면 NPE 걱정 없이 코드를 작성할 수 있어서 오히려 편해진다.
문자열 템플릿
Java에서 문자열에 변수를 넣으려면 +로 이어붙이거나 String.format()을 써야 했다. Kotlin은 $면 된다.
val language = "Kotlin"
val version = 2.0
println("$language $version") // Kotlin 2.0
println("${language.length}글자") // 6글자
println("${if (version > 1.5) "최신" else "구버전"}") // 최신
단순 변수는 $변수명, 표현식은 ${}로 감싼다. 로그 메시지나 에러 메시지를 만들 때 특히 유용하다.
다음 편에서는 Kotlin의 조건문과 반복문을 다룬다. if가 표현식으로 동작하는 것과 when이 Java의 switch를 어떻게 대체하는지 살펴보자.
Loading comments...