728x90
코틀린의 타입 시스템
코틀린은 기본적으로 변수에 null 값을 넣지 못합니다.
이러한 Nullable 한 특징은 NPE(NullPointerException)을 예방해줍니다.
Null 안정성을 가지고 있어 기본적으로 기본 타입에 null 이 들어가면 에러가 발생합니다.
? (물음표)
?(물음표)는 null 값을 넣고 싶을 때 사용합니다. 변수에 null 값을 넣을 수 있다는 것을 의미합니다.
fun main() {
var a: Int? = null // true
var b: Int = null // false
}
employee.manager 가 null 이면 name 변수가 리턴되고 null이 결과 값이 됩니다. null 이 아니면 정상 결과 값을 리턴합니다.
class Employee(val name: String, val manager: Employee?)
fun managerName(employee: Employee): String? = employee.manager?.name
s.length가 null 이면 null 대신 0을 리턴합니다. null 이 아니면 해당 s.length 값을 리턴합니다.
fun strLenSafe(s: String?): Int = s?.length ?: 0
!! (느낌표 두개)
!!(느낌표 두개)는 ?(물음표) 를 통해 만든 null 허용 변수와 nullable한 기본 타입 변수의 연산에서 발생하는 NPE를 방지합니다.
fun main(){
var a: Int? = 3
var b: Int = 2
var sum: Int = 0
// 현재 a 는 null 값이 아닌데, ?(물음표)로 널 허용 변수로 정의되어 있음
// !!(물음표 두개)로 널 값이 아니라고 컴파일러에게 통지해줌
sum = a!! + b
}
as?
어떤 값을 지정한 타입으로 캐스트하고 변환할 수 없으면 null 을 반환합니다.
as? 로 Any 타입인 o 를 Person 으로 캐스트하고 안되면 null 이 되는데 이 경우 ?: (엘비스 연산자)로 false 를 리턴합니다.
class Person(val name: String, val company: Company?){
override fun equals(o: Any?): Boolean {
val otherPerson = o as? Person ?: return false
return otherPerson.name == name && otherPerson.company == company
}
}
let
let 함수를 안전한 호출 연산자와 함께 사용하면 원하는 식을 평가하여 결과가 null 인지 검사합니다.
fun sendEmailTo(email: String) {
println("Sending email to $email")
}
fun main(args: Array<String>) {
var email: String? = "yole@example.com"
// sendEmailTo(email) -> error
email?.let { sendEmailTo(it) }
}