개발하는 자몽

[Kotlin] 기본 문법 1 본문

Java & Kotlin

[Kotlin] 기본 문법 1

jaamong 2025. 1. 18. 09:08

요즘 스프링 개발 환경에서도 코틀린을 사용하는 경향이 꽤 보인다. 그래서 코틀린에 관심이 생겨서 찾아본 기본 문법!

 

변수 타입

코틀린에는 `var`와 `val`라는 두 가지 형태의 변수가 존재한다.

  • `var`: 초기화 이후에도 값 변경이 가능한 가변 변수
  • `val`: 초기화 이후에는 값을 변경할 수 없는 불변 변수
fun main() {
    
    var a = 1  
    a = 2  // 가변 변수이므로 값 변경 가능
    val b = 1
    b = 2  // 불변 변수이므로 에러 발생

    var c: Int  // 타입은 명시했으나, 초기화 하지 않은 상태
    println(c)  // 초기화 하지 않은 상태이므로 에러 발생

    c = 1  // 초기화
    println(c)  // 1 출력
}

 

타입 추론(Type Inference)

타입 추론이란 변수나 함수를 선언할 때 타입을 명시적으로 선언하지 않아도 자동으로 자료형을 추론해 주는 기능이다. 코틀린은 기본적으로 이러한 타입 추론을 지원하므로, 변수를 초기화할 때 명시적으로 타입을 입력하지 않아도 된다. 하지만 협업 시에는 가급적 타입을 명시하는 것이 좋다고 한다.

fun main() {
    
    var a = 1  // int로 타입 추론
    var a: Int = 1 // 타입 명시
}

 

null과 ?

코틀린 변수는 기본적으로 non-null 타입으로, 위와 같이 선언하여 `null`을 할당하면 에러가 발생한다. `null`을 허용하려면 아래와 같이 선언해야 한다.

fun main() {
    
    var str1: String? = null  // str1 변수에는 String이나 null이 들어올 수 있다
    val str2: String? = null
    var str3: String = null  // non-null 타입이므로 에러 발생

    var i: Int? = null // i 변수에는 Int나 null이 들어올 수 있다
}

 

Null Safe Operator `?.`

이번에는 문자열의 길이를 출력해 보자.

fun main() {
    
    var str: String? = "test"
    println(str.length)  // 에러 발생: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'kotlin.String?'.
}
# 위 코드 실행 결과 (에러 발생)
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'kotlin.String?'.

에러를 해석하면 `String?` 타입에서 `null`을 허용하려면 `?.`나 `!!.` 호출이 필요하다는 것 같다.

 

fun main() {
    
    var str: String? = "test"
    println(str?.length)  // 4
}

`str` 변수와 `.` 사이에 `?`를 붙이면 성공적으로 실행이 된다. 정확히는 `?.`에 의해 성공한 것인데, 이는 `str`이 `null`이 아닌 경우에 `?.` 뒤에 있는 명령어를 실행할 수 있게 한다. 이때 쓰인 `?.`는 `null safe operator`라고 한다.

 

fun main() {
    
    var str: String? = null
    println(str?.length)  // null 출력
}

`?.` 앞에 위치한 `str` 변수의 값이 `null`이므로 뒤에 있는 `length` 명령어는 실행하지 않으며, `null`이 출력된다.

 

Not Null Assertion Operator `!!.`

방금 위에서 봤던 에러 문구 중에는 `!!.`도 있었는데, 이는 좌항이 절대 `null`이 아님을 보장한다.

fun main() {
    
    var str: String? = "test" 
    println(str!!.length)  // 4

    var str2: String? = null
    println(str2!!.length)  // str2가 non-null임을 보장 -> null에서 length를 구하는 것이므로 NullPointerException 에러 발생
}

 

 

Elvis Operator `?:`

엘비스 연산자는 좌항이 `null`인 경우 우항에 있는 명령어를 실행한다.

fun main() {
    
    var str1: String? = null
    str1 ?: println("str is null")  // "str is null" 출력

    var str2: String? = "not null"
    str2 ?: println("str is null")  // 아무것도 출력되지 않는다.
}

 

 

 

Comments