Computer Science/[프로그래밍 언어론]

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

연구소장 J 2022. 1. 13. 14:25

 

단축 평가 계산 (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초가 소요된다.

 

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

반응형