Kotlin 더블뱅(!!) 연산자란?
Kotlin에서 "!!" 연산자는 흔히 더블뱅(double-bang) 연산자라고 불리며, 공식 명칭은 널 아님 단정 연산자(not-null assertion operator)입니다.
이 연산자는 어떤 값을 널이 아닌(non-null) 타입의 값으로 변환해 주는 역할을 합니다. 다만, 해당 값이 실제로 null이라면 런타임에 NullPointerException(NPE)을 발생시킵니다. 즉, 개발자가 "이 값은 절대 null이 아니다"라고 컴파일러에게 단정하는 것과 같습니다.
아래 예제를 통해 더블뱅 연산자의 사용 방법을 살펴보겠습니다.
예제 1: 일반적인 nullable 변수 출력
먼저 nullable 타입의 변수 "name"을 선언하고 null을 할당한 뒤 출력해 보겠습니다. 프로그래머 입장에서는 "name"의 값이 null일 때 NullPointerException이 발생하기를 기대하는 상황입니다.
fun main(args: Array<String>) {
var name: String?
name = null
println(name)
}실행 결과
null
위 코드는 단순히 "null"을 출력할 뿐, 우리가 원했던 NullPointerException을 발생시키지 않습니다. 요구 사항을 충족하려면 더블뱅 연산자(!!)를 활용해 코드를 수정해야 합니다.
예제 2: 더블뱅(!!) 연산자 적용
이번에는 name!!처럼 더블뱅 연산자를 붙여 null 여부를 검사하도록 수정한 예제입니다.
fun main(args: Array<String>) {
var name: String?
name = null
// 오버로드 모호성(overload ambiguity) 예외를 해소하기 위해 Nothing? 사용
println(name!! is Nothing?)
}실행 결과
이 코드는 런타임에 NullPointerException을 던집니다.
Exception in thread "main" java.lang.NullPointerException at MainKt.main(main.kt:6)
더블뱅 연산자 사용 시 주의 사항
!! 연산자는 편리하지만, 남용하면 런타임 크래시로 이어질 수 있습니다. Kotlin의 설계 철학은 컴파일 시점에 null 안전성을 확보하는 것이므로, 가능하다면 다음과 같은 대안을 우선 고려하는 것이 좋습니다.
- 세이프 콜 연산자(?.): 값이 null이면 전체 표현식이 null을 반환하여 예외 없이 안전하게 처리됩니다.
- 엘비스 연산자(?:): 값이 null일 때 기본값을 지정할 수 있어 NPE 발생 자체를 방지합니다.
결론적으로 더블뱅(!!) 연산자는 "null이 절대 아님을 보장할 수 있는 상황"에서만 신중하게 사용하는 것이 바람직합니다.