안녕하세요, Dart&&Flutter 개발자 여러분! 오늘 다룰 내용은 여러분의 코드를 더 견고하고 효율적으로 만들어 줄 두 가지 핵심 개념, 바로 널 안전성(Null Safety)과 단락 평가(Short-circuit Evaluation)입니다. 이 두 가지 개념을 이해하면 왜 특정 조건문에서 널(null) 오류가 발생하지 않는지 명확히 파악할 수 있을 겁니다.
Dart 2.12 버전부터 도입된 널 안전성(Null Safety)은 Dart의 가장 큰 특징 중 하나입니다. 이는 런타임에 발생할 수 있는 가장 흔한 오류 중 하나인 널 레퍼런스 오류(Null Reference Error)를 컴파일 시점에 방지하도록 돕습니다.
간단히 말해, 널 안전성은 변수가 null 값을 가질 수 있는지 없는지를 명확히 지정하도록 강제합니다.
String: 이 변수는 절대로 null 값을 가질 수 없습니다.
String?: 이 변수는 null 값을 가질 수도 있고, 아닐 수도 있습니다.
여러분이 작성하신 var test = null; 코드에서 test는 기본적으로 dynamic 타입으로 추론되거나, 혹은 널을 허용하는 타입으로 선언됩니다. 중요한 것은 null 값을 가질 수 있다는 점입니다.
단락 평가(Short-circuit Evaluation): 불필요한 연산을 건너뛰는 똑똑함
&& (AND)와 || (OR) 같은 논리 연산자에는 단락 평가(Short-circuit Evaluation)라는 중요한 특징이 있습니다. 이는 조건식의 일부만으로도 전체 결과가 명확해질 경우, 나머지 부분을 평가하지 않고 건너뛰는 것을 의미합니다.
만약 A가 false라면, B는 평가하지 않습니다. false와 무엇을 AND 연산해도 결과는 항상 false이기 때문입니다. B를 굳이 평가할 필요가 없는 거죠.
2. || (OR) 연산자
A || B 라는 조건식이 있을 때,
만약 A가 true라면, B는 평가하지 않습니다. true와 무엇을 OR 연산해도 결과는 항상 true이기 때문입니다. 역시 B를 평가할 필요가 없습니다.
코드 분석: 왜 if(test!=null && test!)가 오류 없이 작동할까?
이제 여러분이 제시한 코드를 단락 평가와 널 안전성 관점에서 분석해봅시다.
var test = null;
if (test != null && test!) { // 이 부분 주목!
print("hello!!");
}
test != null 평가:
test 변수는 현재 null 값을 가지고 있습니다.
따라서 test != null은 false로 평가됩니다.
단락 평가의 작동:
&& 연산자는 첫 번째 조건(test != null)이 false로 판명되는 순간, 더 이상 뒤의 조건(test!)을 평가하지 않습니다.
전체 조건식 false && (어떤 것)은 이미 false로 확정되었기 때문입니다.
test!는 실행되지 않음:
결과적으로 test!라는 코드는 실행되지 않습니다. 만약 test!가 실행되었다면, test가 null이므로 Null check operator used on a null value (널 체크 연산자가 널 값에 사용됨) 오류가 발생했을 겁니다.
바로 이 단락 평가 덕분에 test!에서 발생할 수 있는 널 오류를 회피하고, 코드가 정상적으로 실행된 것입니다. Dart의 널 안전성 흐름 분석은 앞의 test != null 조건이 true일 경우에만 뒤의 test!가 안전하다고 판단하게 됩니다.
Dart에서 널 안전성과 단락 평가는 서로 시너지를 발휘하여 여러분의 코드를 더욱 견고하게 만듭니다.
&& (AND) 연산자를 사용할 때는 널 체크(!= null)를 먼저 수행하여 뒤따르는 널이 될 수 있는 객체에 대한 연산이 안전하게 이루어지도록 합니다.
이를 통해 불필요한 런타임 오류를 방지하고, 더 읽기 쉽고 예측 가능한 코드를 작성할 수 있습니다.
이 두 가지 개념을 잘 활용하여 여러분의 Dart 개발 여정이 더욱 순조롭고 효율적이기를 바랍니다!