[kotlin] 널 안전성을 갖는 코드 작성 방법
널 안전성은 Kotlin의 강력한 기능 중 하나입니다. 이를 통해 프로그래머는 런타임 중 발생할 수 있는 널 포인터 예외를 줄일 수 있습니다. Kotlin에서는 변수가 널인지 아닌지 명시적으로 표시하여 안전하게 사용할 수 있습니다.
1. 널 가능성 표시하기
변수가 널이 될 수 있는지 여부를 명시하기 위해서는 변수의 타입 이름에 물음표(?
)를 붙입니다.
예를 들어, String
타입의 변수가 널이 될 수 있는 경우 다음과 같이 선언합니다.
var nullableString: String? = null
2. 안전한 호출 연산자(?.
)
변수가 널이 아닌 경우에만 메서드를 호출하거나 속성을 접근하고 싶을 때는 안전한 호출 연산자(?.
)를 사용합니다.
예를 들어, nullableString
이 널이 아닌 경우에만 길이를 출력할 수 있습니다.
println(nullableString?.length)
3. 엘비스 연산자(?:
)
널인 경우 기본값을 사용하고 싶을 때는 엘비스 연산자(?:
)를 활용할 수 있습니다.
val length = nullableString?.length ?: 0
4. 널 검사
null
여부를 검사하려면 if
문이나 when
식을 사용할 수 있습니다.
if (nullableString != null) {
println("String length: ${nullableString.length}")
} else {
println("String is null")
}
when(nullableString) {
null -> println("String is null")
else -> println("String length: ${nullableString.length}")
}
5. 안전한 캐스트 연산자(as?
)
널이 될 수 있는 타입을 다른 타입으로 변환할 때는 안전한 캐스트 연산자(as?
)를 사용합니다.
val lengthInt: Int? = nullableString as? Int
6. 널 가능한 컬렉션 다루기
널 가능한 컬렉션을 다룰 때는 ?.
연산자와 안전한 호출 함수를 활용하여 안전하게 핸들링할 수 있습니다.
val nullableList: List<String>? = listOf("apple", "banana", null, "orange")
val itemLengths = nullableList
?.filterNotNull()
?.map { it.length }
Kotlin에서는 이와 같은 널 안전성의 지원으로 실수에 의한 버그를 효과적으로 예방할 수 있기 때문에 안전한 프로그래밍을 위해 꼭 숙지해야 하는 중요한 개념입니다.
참고 문헌:
- Kotlin 공식 문서: Null Safety