Languege/Kotlin / / 2025. 3. 3. 21:06

[Kotlin Basic] 기초 문법 학습 1

이번 포스팅에서는 본격적인 프로젝트 개발 전 코틀린에 대해 공부 후 정리하려 합니다. "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’라고 불린다고 합니다.

zzzzzz 개발자 식 유머입니다

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가지

  1. Any
    자바의 Object에 대응되는 최상위 타입. null이 필요하다면 Any?로 사용.
    equals, hashCode, toString 메서드를 내장.
  2. Unit
    자바의 void와 유사하지만, 자체로 타입으로서 존재하므로 제네릭 타입 파라미터 등에 사용 가능.
  3. 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