개발하는 자몽

[Kotlin] 기본 문법 1 본문

Java & Kotlin

[Kotlin] 기본 문법 1

jaamong 2025. 1. 18. 09:08

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

 

변수 타입

코틀린에는 varval라는 두 가지 형태의 변수가 존재한다.

  • 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 변수와 . 사이에 ?를 붙이면 성공적으로 실행이 된다. 정확히는 ?.에 의해 성공한 것인데, 이는 strnull이 아닌 경우에 ?. 뒤에 있는 명령어를 실행할 수 있게 한다. 이때 쓰인 ?.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