본문 바로가기
기타 지식들

조건식 순서의 중요성 (단락 평가)

by 클레어몬트 2024. 7. 19.
while (target->key != key && target != NULL) {

}

 

다음 코드는 심각한 오류를 불러올 수 있다

왜 그럴까? 한 번 생각해 보자

.

.

.

.

.

.

.

.

.

.

이유는 target이 NULL값인 상황에 있다

저렇게 target != NULL 조건을 뒤로 보내게 되면 조건식을 따졌을 때 target이 NULL이여도 그대로 target->key != key 조건식을 검사하게 된다 하지만 포인터가 NULL일 때 그 포인터가 가리키는 값을 접근하려고 하면 segmentation fault(프로그램이 허용되지 않은 메모리 영역에 접근하려고 할 때 발생하는 오류)가 일어나게 된다 따라서 조건식을 아래와 같이 target != NULL 먼저 오게 해야 한다

while (target != NULL && target->key != key) {

}

 

 

 

조건 순서에 따른 계산 방식을 "단락 평가" 또는 "단락 회로 평가"라고 한다 영어로는 "short-circuit evaluation"이다

단락 평가는 논리 연산자(AND && 또는 OR ||)를 사용할 때, 표현식의 왼쪽 조건만으로 전체 조건의 결과가 확정될 수 있는 경우 오른쪽 조건을 평가하지 않는 것을 말한다 이는 성능 최적화뿐만 아니라 논리적 오류를 방지하는 데에도 중요하다

 

while (target != NULL && target->key != key)에서 단락 평가가 어떻게 작동되는지 다시 한 번 설명하면

  • target != NULL이 false면, 전체 표현식이 false가 된다. 따라서 target->key != key는 평가되지 않는다.
  • target != NULL이 true면, target->key != key가 평가된다.

단락 평가는 C, C++, Java, 코틀린, js, Python, 스위프트, C# 등 대부분의 프로그래밍 언어에서 동일하게 적용된다

개발자라면 조건문의 순서와 단락 평가를 고려하여 코드를 작성하는 것이 매우 중요하다 :)