ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] NullException
    Kotlin 2022. 9. 14. 16:32

    NullPointException

    - Java 언어로 소프트웨어를 개발하다 보면 NullPointerException 이라는 오류를 자주 만나게 됨. 이는 객체의 주소 값이 담겨져 있지 않는 (null 값이 들어있는) 참조 변수를 통해 객체 접근을 시도하면 발생되는 오류.

    Null Safe

    - Kotlin은 개발자가 null이 담겨 있는 참조변수를 통해 객체 접근을 시도할 때 오류가 발생되는 것을 방지하고자 다양한 방법을 제공하고 있음. 이를 통해 null 값에 대한 안정성을 확보(null safe)할 수 있음

    자료형? - null을 허용하는 자료형으로 지정
    변수명!! - null을 허용하지 않는 형태로 변환.
    변수명?: - null이라면 지정된 기본값이 반환
    변수명?. – 메서드 호출 시 변수값이 null 이라면 메서드가 호출되지 않고 null을 반환
     

    1. !! 연산자

    null을 허용하는 변수에 담긴 객체의 주소 값을 null을 허용하지 않는 형태의 값으로 변환하는 연산자. null을 허용하는 변수에 담긴 값을 null을 허용하지 않는 형태의 변수에 담을 경우 사용함. 변환 과정에서 null 값이 들어 있을 경우 오류가 발생함. 따라서 이 연산자의 사용은 권장하지 않음

    fun testFun1(str:String?){
        val value:String = str!!
        // null을 허용하는 변수에 담긴 값을 null을 허용하지 않는 형태의 값으로 변환 : !!
        // !! 연산을 사용하했더라고, 이미 변수에 null 이 들어있다면 , 그 변수는 null 허용변수이며,
        // 눈가리기식의 변환만 이루어질 뿐
        // null 값을 허용하지 않는 value 변수에 str!!에 들어있는 null 값을 넣는 순간 오류 발생
        // 따라서 이 연산자의 사용은 권장하지 않음
        println("vlaue : $value")
    }
    fun main(){
        testFun1("출력할 메세지")
        // testFun1( null )  // kotlin 의 변수는 기본적으로  null 값을 허용하지 않음
    }
     

    2. ?: 연산자

    참조변수에 null 이 들어있으면 지정된 기본값을 적용

    fun testFun2(str:String?){
        val value:String = str?: "default String"  // null 값을 대비한 기본값 지정
        // str에 null 값이 도착하면, 뒤에 지정해둔  기본값이 대신 사용
        println("testFun2 value : $value")
    }
    fun main(){
        testFun2( "출력될 문자열" )
        testFun2( null )
    }
     

    3. ?. 연산자

    전달 또는 대입된 변수에 null 이 있다면 사용된 멤버메서드 등을 null 로 변환

    fun testFun3(str:String?){
        println("testFun3 str : $str")
        // str 변수가 다른 곳에 전달되지 않고 현재처럼 바로 사용된다면,
        // ?. 을 이용해서 관련 변수의 사용자체 결과를 null로 만듦
        println("testFun3 str length : ${str?.length}")
    }
    fun main(){
        testFun3("문자열")
        testFun3(null)
    }

     

    4. 스마트 캐스팅

    fun testFun4(str:String?){
        if(str is String){ // is의 대상인 str이 null을 저장하고 있으면 결과는 false
            println(str.length)
        }
        // null 을 허용하는 변수가 null 값이 들어있지 않다는 것을 보장해 주면 null을
        // 허용하지 않는 타입으로 스마트 캐스팅이 발생
        if(str != null){  
            // if문 내부에는 null이 아닌 str일 때만 실행되므로 
            // null 값을 허용하지 않는 변수로 스마트 캐스팅 발생(null 이면 false)
            println(str.length)
        }
        // if 문을 통해 null 허용 변수에 null 값이 아닌 객체의 주소 값이 들어 있음을 검사해주면
        // if 문 내부에서는 null을 허용하지 않는 변수로 변환되어 사용 가능
        // if 문이 종료되면 다시 null 허용 변수가 됨. 이때 비교연산은 != 보다 is 추천
    }
    fun testFun5( str:Any? ){
        if(str is String){
            println(str.length)
        }
        // 비교 연산자(!=)로 검사할 경우(스마트캐스팅할 경우) 타입이 Any인 경우 컴파일 오류가 발생
     }
    fun main(){
        testFun4("안녕하세요")
        testFun4(null)
    }

    'Kotlin' 카테고리의 다른 글

    [Kotlin] DataClass  (0) 2022.09.14
    [Kotlin] Ex(Product, Repairable)  (0) 2022.09.14
    [Kotlin] Card Game  (0) 2022.09.14
    [Kotlin] Set  (0) 2022.09.14
    [Kotlin] Map  (0) 2022.09.14

    댓글

Designed by Tistory.