코틀린에서는 nullable, non-nullable 타입을 구분하여 사용한다. #
non-nullable #
var a: String = "abc"
a = null // X : 불가능 (컴파일 오류 발생)
변수 a 에는 non-null 이 보장되기에 아래와 같은 문법 사용 가능하다.
println(a.length) // O
nullable #
var a: String? = "abc"
a = null // O : 가능
변수 a 에는 non-null 이 보장되지 않기에 아래와 같은 문법 사용 불가능하다.
println(a.length) // X : 불가능 (컴파일 오류 발생)
아래(nullable) 예시의 경우, property 를 접근/사용하기 위한 3가지 방법이 있다. #
1. 명시적 null 체크 #
println(if (a != null) a.length else 0)
// 출력 : 0
[참고] if else 구문은 ?:
(Elvis Operator) 로 대체할 수 있다.
// println(if (a != null) a.length else 0)
println(a?.length ?: 0)
2. Safe calls(?.
)
#
// a 가
// null : null
// non-null : a.length
println(a?.length)
// 출력 : null
[참고] safe call 의 경우 아래와 같이 chain 형태로 유용하게 사용할 수 있다.
person?.department?.head?.name
[참고] “safe call(non-null 보장) + 로직 수행” 을 위해, let
을 사용할 수 있다.
a?.let { println("hi") }
[참고] safe call 의 경우, assignment 위치에서 사용하는 것도 가능하다.
- null 이 포함되면 assignment 는 생략된다.
- 표현식(함수)의 경우, 실행되지 않음에 주의한다.
person?.department?.head = managersPool.getManager()
// person, department 중 하나가 null 인 경우 getManager() 은 실행되지 않는다.
3. Not-null assertion operator !!
#
- non-null type 컨버팅
- 단, null 일 경우 NPE 발생
// a!! 는 String? 을 String 으로 컨버팅한다.
// 단, a 가 null 인 경우 NPE 발생한다.
println(a!!.length)
[기타] Safe casts #
Safe cast 통해 ClassCastException 대신 null 을 반환할 수 있다.
타입 캐스팅 시 잘못된 타입일 경우 → ClassCastException
발생
null 인 경우, NPE 발생
예시 : “null cannot be cast to non-null type kotlin.Int”
// 잘못된 타입인 경우, null 반환
val aInt: Int? = a as? Int
[기타] Collections of a nullable type #
nullable 요소를 가진 컬렉션의 경우, null 과 관련된 처리를 할 수 있는 여러 함수가 있다.
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()