Dart 개발자를 위한 필수 지식: 널 안전성과 단락 평가

길위에 히피·2025년 6월 17일

Flutter

목록 보기
51/56

안녕하세요, Dart&&Flutter 개발자 여러분! 오늘 다룰 내용은 여러분의 코드를 더 견고하고 효율적으로 만들어 줄 두 가지 핵심 개념, 바로 널 안전성(Null Safety)단락 평가(Short-circuit Evaluation)입니다. 이 두 가지 개념을 이해하면 왜 특정 조건문에서 널(null) 오류가 발생하지 않는지 명확히 파악할 수 있을 겁니다.

널 안전성(Null Safety): 널 레퍼런스 오류를 원천 차단!

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)라는 중요한 특징이 있습니다. 이는 조건식의 일부만으로도 전체 결과가 명확해질 경우, 나머지 부분을 평가하지 않고 건너뛰는 것을 의미합니다.

  1. && (AND) 연산자
    A && B 라는 조건식이 있을 때,

만약 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 개발 여정이 더욱 순조롭고 효율적이기를 바랍니다!

profile
마음맘은 히피인 일꾼러

0개의 댓글