
이번 포스팅에서는 본격적인 프로젝트 개발 전 코틀린에 대해 공부 후 정리하려 합니다. "val vs var", "Null 안전(null-safety)", 그리고 "타입 캐스팅" 등 자바 개발자가 코틀린을 처음 접할 때 꼭 알아야 할 핵심 문법을 소개해보겠습니다.
🔄 왜 Kotlin인가?
Java와 비교했을 때, 코틀린은 다음과 같은 장점을 제공합니다.
- 간결성: 세미콜론 등이 없어 코드 양이 줄고, 가독성이 높음
- Null-Safety: 언어 차원에서 null 처리를 강제해 NPE 발생을 줄여줌
- 함수형 스타일 지원: 고차함수, 람다식 등 함수형 프로그래밍 기법을 활용하기 쉬움
- 상호운용성(Interoperability): 자바와 100% 호환되어 기존 자바 코드를 그대로 사용 가능
Java 프로젝트에서 코틀린을 도입할 때, 조금의 학습을 통해 생산성과 코드 안정성을 크게 향상시킬 수 있습니다.
🚀 val vs var
코틀린에서 변수를 선언할 때는 보통 두 가지 키워드를 사용합니다.
1. var (가변 Reassign 가능)
var로 선언된 변수는 값을 변경할 수 있습니다.
자바의 일반 변수 선언과 유사하며, “variable”의 약자라고 볼 수 있습니다.
var number1: Long = 10L
number1 = 20L // Reassign 가능
2. val (불변 Reassign 불가능)
val로 선언된 변수는 최초 할당 후 값을 변경할 수 없습니다.
자바의 final 키워드와 유사하며, “value”의 약자입니다.
val number2 = 10L
// number2 = 20L // Error: Val cannot be reassigned
- 가능하면 모든 변수를 val로 선언하여 불변성을 유지하고, 꼭 필요한 경우만 var를 사용하는게 좋음
✨ Null 안전: Safe Call & Elvis
코틀린에서 null 처리는 언어 차원에서 강제됩니다.
Null이 가능한 타입(String?)과 불가능한 타입(String)을 명확히 구분하므로 Java 대비 NPE(Null Pointer Exception)가 크게 줄어듭니다.
1. Safe Call (?.)
null이 될 수 있는 변수를 안전하게 호출할 때 사용합니다.
val str1: String? = "ABC"
val str2: String? = null
// Safe Call
println(str1?.length) // 3
println(str2?.length) // null (NPE 발생 X)
- str2가 null이면 뒤의 length 호출을 수행하지 않고 null을 반환
2. Elvis 연산자 (?:)
Safe Call 결과가 null인 경우, 대신 사용할 값을 지정해줄 수 있습니다.
val result: Int? = str2?.length
println(result ?: 10) // str2?.length가 null이면 10을 사용
- “?:”을 시계방향으로 돌려보면 “엘비스 프레슬리의 머리칼....;;”처럼 보인다 하여 ‘Elvis operator’라고 불린다고 합니다.

3. !! (Double Bang)
개발자가 “이건 절대 null 아니다!!”를 강제로 선언할 때 사용합니다.
fun neverNullValue(str: String?): Boolean {
return str!!.startsWith("A")
}
- 만약 str가 null이라면 런타임에 NPE가 발생하기에, 아주 특별한 경우가 아니면 지양하는 것이 좋습니다.
🏷️ 타입 캐스팅과 스마트 캐스팅
자바에서의 cast와 instanceof 연산은 코틀린에서 다음과 같이 표현됩니다.
1. is (instanceof) & as (캐스팅)
- 자바의 instanceof → 코틀린의 is
- 자바의 (Type) → 코틀린의 as
fun printAgeIfPerson(obj: Any) {
if (obj is Person) {
val person = obj as Person
println(person.age)
}
}
2. 스마트 캐스팅 (Smart Casting)
위와 동일하게 if (obj is Person)이라는 조건이 통과되면, 이후 obj를 별도 캐스팅 없이 Person으로 사용 가능하게 해줍니다.
fun printAgeIfPerson(obj: Any) {
if (obj is Person) {
// 이미 obj가 Person임을 알기에 캐스팅 없이 사용
println(obj.age)
}
}
3. 안전한 캐스팅: as?
캐스팅 불가시 Exception을 던지는 대신 null 반환을 원한다면 as? 를 사용합니다.
fun printAgeIfPerson(obj: Any) {
val person: Person? = obj as? Person
println(person?.age)
}
- 캐스팅 실패 시 person은 null이 되어 NPE 없이 안전하게 처리 가능합니다.
🪄 Kotlin의 특이한 타입 3가지
- Any
자바의 Object에 대응되는 최상위 타입. null이 필요하다면 Any?로 사용.
equals, hashCode, toString 메서드를 내장. - Unit
자바의 void와 유사하지만, 자체로 타입으로서 존재하므로 제네릭 타입 파라미터 등에 사용 가능. - Nothing
“절대 정상 종료되지 않음”을 표현하는 타입.
무한루프나 예외만 던지는 함수의 반환 타입을 나타낼 때 사용.
(일반적으로 크게 쓸 일은 없겠네요)
🏗️ new 키워드를 사용하지 않는 코드 스타일
코틀린은 Java와 달리 객체 생성 시 new 키워드를 사용하지 않습니다.
예시:
val person = Person("Joshua")
- 내부적으로는 자바와 동일하게 JVM 바이트코드로 변환되지만, 문법적으로 더 간결합니다.
- Java 코드를 많이 써온 개발자들은 어색할 수 있지만, 익숙해지면 편리합니다.
📌 정리
이번 포스팅에서는 자바 개발자가 코틀린을 배우면서 처음 접하게 되는 기초 문법(변수 선언, null 안전성, 타입 캐스팅 등)에 대해 살펴보았습니다.
- 자바의 final과 유사한 val 키워드
- 언어 차원의 null 안전 처리 (Safe Call, Elvis, !!)
- 타입 검사 및 스마트 캐스팅 (is, as, as?)
- Any, Unit, Nothing 등의 특이한 타입
- new 키워드 없이 객체 생성하기
코틀린은 이러한 언어적 특성 덕분에 NPE를 줄이고, 코드를 더 간결하게 작성할 수 있도록 도와 줄 수 있을거같고, 문법에 대한 개념만 살펴봤는데 코틀린을 왜 다들 그렇게 좋아하는지 알 수 있는 것 같습니다.
다음 편에서는, Kotlin 학습을 계속 이어가겠습니다.
'Languege > Kotlin' 카테고리의 다른 글
[Kotlin Basic] 기초 문법 학습 5 (0) | 2025.03.12 |
---|---|
[Kotlin Basic] 기초 문법 학습 4 (0) | 2025.03.10 |
[Kotlin Basic] 기초 문법 학습 3 (1) | 2025.03.06 |
[Kotlin Basic] 기초 문법 학습 2 (0) | 2025.03.04 |