Kotlin - 변수 다루기, Safe Call, Elvis 연산자

박경희·2025년 3월 20일
0

강의 복습 및 정리

목록 보기
33/38

var - 가변
val - 불변

  • 코틀린에서는 모든 변수에 수정 가능 여부(var / val)를 명시해주어야 한다.
  • 코틀린은 컴파일러가 타입을 자동으로 추론해준다.
  • 모든 변수는 우선 val로 만들고 필요한 경우 var로 변경하여 사용하자.
  • boxing / unboxing을 고려하지 않아도 된다.

nullable 변수

null이 들어갈 수 있다는 것을 알려주기 위해 타입 뒤에ㅐ ?을 붙인다.
ex) <Long?>

  • 코틀린은 변수에 null이 들어갈 수 있는지 없는지를 처음부터 표시해줘야 한다.

객체 인스턴스화

  • new를 사용하지 않는다.
fun startWithA(str: String): Boolean { // string에 ? 가 없으니까 널이 들어올 수 없으므로 바로 리턴이 가능하다.
    return str.startsWith("A")
}

fun startsWithA1(str: String?) : Boolean {
    if (str == null) {
        throw IllegalArgumentException("null이 들어왔습니다.")
    }
    return str.startsWith("A")
}

fun startsWithA2(str: String?): Boolean? { //null 반환 가능
    if (str == null) {
        return null
    }
    return str.startsWith("A")
}

fun startsWithA3(str: String?): Boolean {
    if (str == null) {
        return false
    }
    return str.startsWith("A")
}

1. Safe Call (?.)

널인지 먼저 체크하고, 널이 아니면 실행해주는 연산자

ex1)

val name: String? = "솜사탕"
val length = name?.length
  • namenull이 아니면 length를 가져오고

  • null이면 lengthnull이 됨

즉, 널포인터 예외(NullPointerException)를 방지하기 위한 연산자다.

ex2)

val user: User? = null
val username = user?.name

usernull이면 → usernamenull

usernull이 아니면 → user.name 호출됨


2. Elvis 연산자 (?:)

앞의 값이 null이면, 뒤의 값을 대신 사용해

ex)

val name: String? = null
val finalName = name ?: "기본값"
  • namenull이니까 finalName은 "기본값"

즉, null에 대한 기본값(default)을 지정할 때 사용하는 연산자다.

Safe Call과 Elvis 연산자 같이 사용하기

ex)

val user: User? = getUser()
val nickname = user?.nickname ?: "손님"
  • usernull이면 → "손님"

  • user.nicknamenull이어도 → "손님"

  • user.nickname이 존재하면 → 그 값을 사용


3. null이 아닌 단언 연산자 !!

변수에 null이 아닌 게 확실할 때 강제로 null이 아님을 단언하는 연산자

ex)

val name: String? = "솜사탕"
val length = name!!.length
  • namenull이 아닐 거라고 믿고 length 호출

만약 name이 실제로 null이면 예외(NPE) 발생

주의: null이면 바로 죽음

val name: String? = null
val length = name!!.length //  NullPointerException 발생!
  • 정말 이 시점에서는 null일 리 없다! 라는 확신이 있을 때만 사용해야 한다.

  • 테스트 코드, 간단한 샘플, 프레임워크 내부에서 절대 null이 아니도록 보장될 때

  • 실무에서는 !!를 피하는 게 일반적이다.

  • ?., ?:, requireNotNull(), checkNotNull() 등을 사용하는 게 더 안전하고 명시적이다.


requireNotNull()

Kotlin에서 !!와 관련된 안전한 대안 requireNotNull()

null이 아니어야 한다고 명시적으로 검증하고,
null이면 IllegalArgumentException을 던져준다.

fun printName(name: String?) {
    val safeName = requireNotNull(name) { "이름은 null이면 안 돼요!" }
    println("이름은 $safeName")
}
  • name이 null이면 → 예외 발생 (IllegalArgumentException)

  • name이 null이 아니면 → 정상 실행

  • !!처럼 막 쓰지 않고 검증 + 메시지까지 가능해서 디버깅에 유리하고

  • 안전하게 fail fast(빨리 죽기) 원칙에 맞는다.


참고 -자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

0개의 댓글