let을 통한 널 체크?

이태훈·2022년 2월 23일
0

아래 글을 보고 그냥 두서없이 적어봅니다..
https://dev.to/vlazdra/a-decompiled-story-of-kotlin-let-and-run-4k83

보통 코틀린을 사용하는 사람들은 널체크를 할 때 let을 사용하여 많이 합니다.

왜냐하면 코틀린 공식 가이드에서도 다음과 같이 안내를 하고 있기 때문입니다.

그래서 저도 막연히 널체크를 할 때 let을 사용하는 경우가 있었는데, 다음과 같은 코드를 보고 let을 사용하여 널 체크를 할 때 좀 더 신중을 기해야겠다고 생각이 들었습니다.

문제의 코드는 아래와 같습니다.

var nullableValue: String? = ""
var nullableValue2: String? = null

nullableValue?.let {
	nullableValue2?.let {
		println("print1")
	}
}?: run {
	println("print2")
}

위의 코드 실행 결과는 print2가 출력이 됩니다.

저는 run block이 nullableValue가 null이 아니니 실행이 안 될 줄 알았지만, 저의 예상을 뒤엎고 run block이 실행이 되었습니다..

run block이 실행되는 이유는 nullableValue의 let block 안에 있는 nullableValue의 let block에서 null이 리턴 되어서 거기서 나온 null 때문에 run block이 실행이 됩니다.

정확하게 보기 위해 자바 코드로 디컴파일 해보겠습니다.

Unit var10000;

if (this.nullableValue != null) {
    if (this.nullableValue2 != null) {
        String var11 = "print1";
        System.out.println(var11);
        var10000 = Unit.INSTANCE;
    } else {
    	var10000 = null;
    }

	if (var10000 != null) {
    	return;
    }
    
    String var6 = "print2";
    System.out.println(var6);
    var10000 = Unit.INSTANCE;
}

중첩된 if 문에서 var10000에 null을 대입해서 prtint하는 코드가 실행되는 것을 볼 수 있습니다.

저렇게 코드를 짤 일이 거의 없긴 하지만 저런 경우가 발생할 수도 있다는 것을 알게 되었고, 무작정 let으로 널체크를 하면 의도대로 코드가 동작하지 않을 수 있다는 것도 알게 되었습니다.

그렇지만 저런 형태로 널체크를 하고싶다! 하시는 분들은 개인적으로 also도 같이 사용해보시는 것을 추천드립니다.

nullableValue?.also {
	
    //null이 리턴될 수 있는 block
    
}?: run {
	println("print2")
}
profile
https://www.linkedin.com/in/%ED%83%9C%ED%9B%88-%EC%9D%B4-7b9563237

0개의 댓글