단축 평가 계산 (Short-circuit Evaluation)
단축 평가 계산이란 첫 번째 인수가 값을 결정하기에 충분하지 않은 경우에만 두 번째 인수가 평가되는 일부 프로그래밍 언어(C, C++, JAVA 등)의 일부 논리 연산(AND, OR)의 계산이다.
예를 들어 C언어의 경우를 들어보자.
int i=1;
int j=2;
if( i<j || i=3 ){
printf("%d\n", i);
// 출력 : 1
}
위의 경우 i의 값이 3으로 바뀌지 않고 1로 출력된다. 그 이유가 무엇일까?
그 이유는 i<j의 값이 참이므로 논리 연산 OR(||)의 결과값이 무조건 참이 되기 때문에 뒤의 연산을 진행하지 않은 것이다. 따라서 i=3은 실행되지 않는다.
AND의 경우도 살펴보자.
int i=1;
int j=2;
if(i>j && i=3){
printf("%d", i);
// 실행되지 않음
}else{
printf("%d", i);
// 출력 : 1
}
위의 경우도 i의 값이 3으로 바뀌지 않고 1로 출력된다.
i>j가 거짓이므로 논리 연산 AND(&&)의 결과 값이 무조건 거짓이 되기 때문에 뒤의 연산을 진행하지 않는다.
따라서 i=3은 실행되지 않는다.
단축 평가 계산을 염두에 두고 프로그래밍한다면 시간 복잡도를 줄일 수 있다.
예를 들어 아래와 같은 경우를 살펴보자.
// func1() - 1초 소요
// func2() - 100초 소요
/* 첫번째 방법 */
if( func1() || func2() ){
printf("true");
// 1초만에 끝날 수도 있음
}
/* 두번째 방법 */
if( func2() || func1() ){
printf("true");
// 최소 100초가 걸림
}
func1() 함수가 1초가 소요되고, func2() 함수가 100초가 소요된다고 하자.
첫 번째 방법은 만약 func1()의 결과값이 참이라면 시간이 1초밖에 소요되지 않을 것이다.
func1()이 결과값이 참이라면 단축 평가 계산에 의해 func2() 함수를 수행하지 않기 때문이다.
두 번째 방법은 func2()의 결과값이 참이라면 마찬가지로 func1() 함수를 수행하진 않겠지만
func2()의 소요시간이 100초이므로 100초가 소요된다.
따라서 프로그래머는 단축 평가 계산을 고려해 비용이 높은 코드는 나중에 평가되도록 작성해야 한다!