[프로그래밍 언어론] 단축 평가 계산(Short-circuit Evaluation)

단축 평가 계산 (Short-circuit Evaluation)

short circuit evaluation
[그림 1] 단축 평가 계산

단축 평가 계산이란 첫 번째 인수가 값을 결정하기에 충분하지 않은 경우에만 두 번째 인수가 평가되는 일부 프로그래밍 언어(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초가 소요된다.

 

따라서 프로그래머는 단축 평가 계산을 고려해 비용이 높은 코드는 나중에 평가되도록 작성해야 한다!

반응형

댓글

Designed by JB FACTORY