코틀린의 Null Safety
코틀린은 자바에서 흔히 볼 수 있는 NullPointerException 오류를 피할 수 있게 돕는
널 가능성이라는 타입 시스템 특성이 존재함
- 타입 시스템에 널이 될 수 있는지 여부를 추가함으로써 컴파일러가 여러가지 오류를 컴파일 시
미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄임
Null값 허용하기 : ?
1. 변수에 null 허용 설정
- null 허용을 위해 변수 선언시 타입 뒤에 ?(nullable)를 붙여야 함
class Nullable {
var nullable: String? = null
}
2. 함수 파라미터에 null 허용 설정
- 함수 파라미터가 null을 허용하려면 해당 파라미터에 대해
null 체크를 먼저 해야 사용 가능.
즉, if문으로 null인지 체크.
fun strLen(s: String): Int = s.length
s에는 null이 될 수 있는 인자를 넘기는 것이 금지되거나
컴파일 오류가 발생함
fun strLen(s: String?): int = s.length
s 뒤에 ?를 붙여주면 null을 인자로 받을 수 있음
위처럼 타입 뒤 ?를 붙이면 그 타입의 변수나 프로퍼티에 null을 참조, 저장할 수 있다는 뜻
반대로 ?가 없다면 그 타입은 null을 참조할 수 없다는 뜻
그러므로 코틀린의 모든 타입의 기본은 null을 참조할 수 없음
위 코드를 실행하면 오류가 발생함.
s가 null을 인자로 받을 수 있기 때문에 메소드 length를 직접 호출할 수 없기 때문
fun strLen(s: String?) : int =
if(s !== null) s.length else 0
이를 해결하기 위해 null이 아닐 때라는 조건을 추가해서 동작시켜주어야 함
함수 리턴타입에 null 허용 설정
fun nullReturn(): String? {
return null
}
함수 리턴 타입에 Nullable이 지정되어 있지 않으면 null 리턴 불가
안전한 호출 연산자 ?.
if (s != null) {
s.toUpperCase()
} else {
null
}
s?.toUpperCase()
위의 자바 코드를 코틀린의 안전한 호출 연산자(?.)를 사용하면
아래와 같이 간략하게 작성 가능
s가 null이 아니면 toUpperCase()를 실행하고 null이면 null을 반환함
val result: String? = s?.toUpperCase()
이처럼 안전한 호출 연산자를 사용하여 값을 받을 경우
그 프로퍼티의 타입은 ?를 붙여서 널 가능성을 명시해주어야 함
class Person(val name: String, val company: Company)
fun Person.countryName() : String{
val country = this.company?.address?.country
return if(country != null) country else "unKnown"
}
위와 같이 안전한 호출 연산자를 연속으로 사용하여 데이터에 대한 null 체크를 연속으로 할 수도 있음
엘비스 연산자 ?:
null일 때 사용할 디폴트 값을 지정하는 연산자
fun strLenSafe(s: String?): Int = s?.length ?: 0
안전한 호출 연산자를 사용해서 null을 반환한 값에
엘비스 연산자를 붙이면 0을 반환하게 됨
이러한 엘비스 연산자를 사용하여 우항에 return이나 throw 등을 넣어
null일 경우 예외 처리를 할 수 있음
fun printShippingLabel(person: Person) {
val address = person.company?.address
?: throw IllegalArgumentException("No Address")
with (address) {
println("")
}
}
이렇게 안전한 호출 연산자(?.)와 엘비스 연산자(?:)를 활용하여
자바의 "if not-null" 검사를 간편하게 수행할 수 있음
is 연산자
val num = 1
if (num is Int) {
print(num)
} else if (num is not Int) {
print("not int")
}
is와 !is 연산자를 통해 런타임에 객체가 주어진 타입인지 확인할 수 있음
안전한 캐스트 연산자 as?
어떤 값을 지정한 타입으로 캐스트를 하고,
만약 대상 타입으로 캐스트가 불가능할 경우 null 반환
val x = "kotlin"
val y: Int?= x as? Int
'Android' 카테고리의 다른 글
Hilt (2) | 2023.12.05 |
---|---|
[Kotlin] 코틀린 기본 문법 (3) (0) | 2022.08.12 |
[Kotlin] 코틀린 기본 문법 (1) (0) | 2022.08.09 |
[Android] Activity란? (0) | 2022.08.09 |
[Android] BottomNavigation + ViewPager2 (0) | 2022.04.06 |