Kotlin 연산자 - ? / !! / ?: / is / as
kotlin은 Java와 다르게 null이 가능한 Nullable Type과 불가능한 NonNullable Type이 있습니다.
- NonNullable Type
val str: String
- Nullable Type
val str: String?
NonNullable Type에는 이름처럼 null값이 들어가지 않습니다. 런타임 중간에 null이 들어가게되면 에러가 발생하며 실행코드에서 null을 넣으면 빌드되지 않습니다.
특히 Java에서 Kotlin으로 Migration 할 때 Java는 모든 것이 Nullable인 것에 비해 Kotlin은 type을 명확하게 나누어 null에 대해 엄격하기 때문에 신경을 많이 써주셔야 합니다.
이러한 null type에 관련된 연산자와 type에 관련된 연산자를 설명해보겠습니다.
?. 연산자
? 연산자는 Nullable 한 변수가 Nullable 하지 않은 함수, 변수에 접근할 때 사용합니다.
val user: User? = null
print(user.getUserName())
class User {
val name = "kim";
fun getUserName(): String{
return this.name;
}
}
위 코드를 보면 Nullable 한 User의 instance인 user 변수가 NonNullable 한 getUserName() 함수에 접근하려 합니다.
이 경우 컴파일 에러가 발생하며 null처리를 해줘야합니다.
user?.getUserName()
위와같이 변경하면 user가 null일 시 위 코드는 null을 반환하며 null이 아니면 getUserName()을 진행합니다.
!! 연산자
!! 연산자는 Nullable 한 변수가 null이 안 올 것이라고 예상해 Nullable 하지 않은 함수, 변수에 강제로 접근할 수 있게 해 줍니다.
user!!.getUserName()
위와 같이 강제로 접근 가능하게 해 주지만 user가 null일 때는 런타임에러가 발생하기 때문에 확실히 null이 오지 않을 때만 사용해야 합니다.
?: 연산자
?: 연산자는 엘비스 연산자라고도 합니다. null 값을 반환할 때 ?: 연산자 뒤에 있는 식을 대신 반환합니다.
user?.getUserName()?:"no name"
해당 코드는 user가 null 일 때 null이 아닌 "no name"을 반환합니다.
is / !is 연산자
is 연산자는 A is B에서 A가 B type이면 true를 반환합니다.
val user: User? = null
print(user is User?) // true
val user: User? = null
print(user !is User) // true
User?와 User 객체도 구분되며 !is는 반대 결괏값을 반환합니다.
as / as? 연산자
as 연산자는 A as B에서 A를 B타입으로 변환시켜 줍니다. 변환시킬 수 없다면 ClassCastException이 발생합니다.
때문에 as?를 써서 null을 반환하거나 is를 사용하여 변환할 수 있는 타입인지 먼저 확인합니다.
val user: Any = User()
print(user.getUserName())
해당 상황에서는 컴파일 에러가 발생합니다. User()는 getUserName() 함수를 사용할 수 있지만 Any type은 getUserName()을 사용할 수 없기 때문입니다.
val user: Any = User()
user as User
print(user.getUserName())
위와 같이 type casting을 통해 에러를 막을 수 있습니다. 또한 safe 한 type casting을 통해 에러를 방지할 수 있습니다.
val user: Any = ""
print(user as? User) // null
위의 경우는 null을 반환합니다.
val user: Any = ""
print(user as? User?: "no user") // null
엘비스 연산자를 사용하여 null이 아닌 다른 값을 반환할 수 도 있습니다.
※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.
'Android > Kotlin' 카테고리의 다른 글
백킹프로퍼티(Backing Properties)란? (0) | 2023.04.06 |
---|---|
Scope Function (0) | 2023.02.21 |
List, Set, Map (0) | 2023.02.20 |