코틀린에서 널이 될 수 있는 타입을 명시적으로 작성한다. 이를 통해 NullPointerException으로부터 안전하게 사용할 수 있다.
아래와 같은 코드를 작성하면 코틀린은 컴파일 에러를 발생한다.
fun main() {
strLen(null)
}
fun strLen(s: String) = s.length
널 값을 허용하게 하고 싶다면 타입의 ?을 붙여주면 된다.
String? 와 같이 작성할 수 있다.
위에 예제에서 s의 타입을 String? 으로 변경하게 된다면 s.length 를 호출 할 수 없게된다.
if(s != null) s.length 와 같이 널이 아님을 검사한 후에야 .length()메서드를 호출 할 수 있다.
이처럼 코틀린은 널이 될 수 있는 타입과 없는 타입을 엄격히 다뤄 컴파일단계에서 예외처리가 가능하도록 해준다.
코틀린에서는 널이 될 수 있는 타입에 대해서 안전한 호출 방법을 제공한다. 아래에 예제를 확인해보자
class Employee(
val name: String,
val manager: Employee?
) {
fun managerName(): String? {
return this.manager?.name
}
}
mavager는 널이 될 수 있는 타입이기에 매니저가 주입되지 않고 manager.name을 사용하게 될 경우 널포인트 예외가 발생한다. 이때 ?.을 사용하면 널이 아닌 경우에는 getName()을 널인 경우는 null을 반환하게 된다.
위에 안전한 호출도 널이 아닐 경우 ?. 다음 메서드나 프로퍼티를 가져오지만 널일 경우 널을 반환한다.
이럴때 기본 값을 설정하는 방법으로 엘비스 연산자가 있다.
엘비스 연산자는 이항 연산자로 아래와 같이 좌측 값이 널이 아니면 좌측 값을 널이면 우측에 작성한 기본 값을 사용한다.
fun foo(s: String?) {
val t: String = s ?: ""
}
as 키워드를 이용하면 코틀린에서는 타입 변환을 할 수 있다.
다만 형변환이 불가능할 경우 ?를 붙여주게 되면 변환 불가시 null을 반환한다.
널이 될 수 있는 타입을 강제로 널이 될 수 없는 타입으로 변환하는 방법이다.
이 방법은 널이 될 수 있는 타입이 실제로 널인데 사용할 경우 널포인트예외가 발생한다.
따라서 굉장히 권장하지 않는 방식이다!!
안전한 호출을 사용한 let 함수를 이용해서 해당 변수를 안전하게 사용하자!
자바로 선언된 코드를 코틀린에서 이용할 경우 해당 타입으로 지정된다.
해당 타입은 널이 될 수 있는 타입과 널이 될 수 없는 타입 둘 다 될수 있다.
플랫폿 타입은 선언을 할 수 없고 컴파일러가 해당 타입으로 인식할 뿐이다.