🌈 Programming/Kotlin

Kotlin에서 타입 시스템 활용법

nerowiki 2024. 5. 22. 21:08
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) }
}