Kotlin은 타입 시스템을 통해 null에 대한 안전한 작업을 구현합니다: 모든 타입은 기본적으로 null이 될 수 없으며, 예를 들어 val a: String = null은 컴파일 오류를 발생시킵니다. null 할당 가능성을 나타내기 위해 질문 기호 ?를 사용합니다. 예:
val name: String? = null
Nullable 타입 작업을 위한 제공 사항은 다음과 같습니다:
?.는 객체가 null인 경우 null을 반환하고 그렇지 않으면 메서드/필드를 호출합니다: name?.length.?:는 왼쪽이 null일 때 기본값을 설정합니다: val length = name?.length ?: 0if (name != null) { println(name.length) }
null일 경우 NullPointerException을 발생시키면서 값을 강제로 가져옵니다 (극히 신중히 사용됨):val length = name!!.length
모범 사례: Nullable 타입을 최소화하고 Safe-call 및 Elvis 연산자를 사용하며 !!를 피하고, null이 허용되는 상황을 명확히 모델링합니다.
val a: String타입에null값을 할당할 수 있습니까? 이를 피하려면 어떻게 해야 합니까?
답변: 아니요, 기본적으로 Kotlin에서는 타입이 null과 같을 수 없습니다. null 할당을 허용하려면 명시적으로 val a: String? = null을 지정해야 합니다. ?가 없는 타입은 항상 non-null입니다.
이야기
은행 애플리케이션 프로젝트에서
User타입의 변수는 고객 검색 결과를 저장했습니다. 개발자는var user: User를 정의했으나 때때로 고객이 발견되지 않아 서비스가 null을 반환했습니다. 이는 NPE를 일으키고 대규모 충돌을 발생시켰습니다.
이야기
지원용 챗봇에서 사용자가 보낸 메시지에 접근하기 위해 !!를 사용했으나 (
message!!.text) 메시지가 항상 온다고 생각했습니다. 빈 메시지가 처음에 발생하여 봇이 충돌했습니다. Safe-call이 문제를 해결했을 것입니다.
이야기
모바일 애플리케이션에서 데이터베이스의 데이터가 로드되지 않을 수 있으며 null로 도착했습니다. 개발자는 안전한 접근 대신 직접 접근을 사용하여 불완전한 데이터로 인해 모든 경우에 크래시가 발생했습니다.