본문 바로가기

나의 백과사전

연산 생략 (건너뛰기 평가) (Short-Circuit Evaluation)

1
2
3
4
if( 2 + 2 == 4 || 1 == 0)
{
    printf("This line will be printed."); 
}

(예제 코드는 C언어입니다.)


프로그래밍에서 건너뛰기(Short-Circuit) 평가는 위의 예에서 or 연산자(||) 왼쪽에 있는 조건이 True가 되면


전체 표현식이 True로 평가되는 경우를 말합니다.


or 연산자는 왼쪽 조건이 True이건 False이건 상관없는데, or연산자는 True가 하나만 있으면 True가 되기때문입니다.


때문에 위 예에서 if문 안의 2 + 2 == 4 조건이 True 이기 때문에 오른쪽의 조건 1 == 0 은 평가가 생략됩니다.


## truefalsefizz.py  건너띄기 평가의 예

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
def TrueFizz(message):
    print(message)
    return True

def FalseFizz(message):
    print(message)
    return False

if FalseFizz('Cats') or TrueFizz('Dogs'):
    print('Step 1')

if TrueFizz('Hello') or TrueFizz('Goodbye'):
    print('Step 2')

if TrueFizz('Spam') and TrueFizz('Cheese'):
    print('Step 3')

if FalseFizz('Red') and TrueFizz('Blue'):
    print('Step 4')

(예제 코드는 Python3로 작성되었습니다.)



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>

bool TrueFizz(char message[])
{
    printf("%s\n",message);
    return true;
}

bool FalseFizz(char message[])
{
    printf("%s\n",message);
    return false;
}


int main(void)
{
    if(FalseFizz("Cats") || TrueFizz("Dogs"))
    {
            printf("Step1 \n");
    }

    if(TrueFizz("Hello") || TrueFizz("Goodbye"))
    {
            printf("Step2 \n");
    }

    if(TrueFizz("Spam") && TrueFizz("Cheese"))
    {
            printf("Step3 \n");
    }

    if(FalseFizz("Red") && TrueFizz("Blue"))
    {
            printf("Step4 \n");
    }

    return 0;
}

(이 예제 코드는 C/C++ 로 작성되었습니다. 위 Python3 와 동일한 효과의 예제 코드입니다.)


이 프로그램을 수행하면 다음과 같은 결과를 볼 수 있습니다.

Cats
Dogs
Step 1
Hello
Step 2
Spam
Cheese
Step 3
Red
>>> 


이 작음 프로그램에는 함수가 TrueFizz()을 평가한다. 이함수는 우선 'Cats'를 출력한다.


첫 번째 if문 (Cats and Dogs)

아홉 번째 줄의 첫 번째 if문은 FalseFizz()를 평가한다. 이 함수는 우선 'Cats'를 출력한다.

첫 번째 if문의 전체 표현식은 True인데, or 오른쪽 표현식이 True이기 때문에 TrueFizz('Dogs')를 평가하고 'Dogs'가 출력된다.

아홉번째 줄 코드의 if문은 False or True 가되고 전체는 True가 된다.


두 번째 if문 (Hello and Goodbye)

12번째 줄의 두 번째 if문에서는 건너뛰기가 이러난나 TrueFizz('Hello')를 호출하면 'Hello'를 출력하고 True를 반환한다.

파이썬은 다음 TrueFizz('Goodbye')를 호출하지 않는데 or문의 왼쪽이 True이므로 오른쪽은 어떤 값이 오더라도 상관없다.

따라서 'Goodbye'는 화면에 출력되지 않는다.  조건문은 True가 된다.


세 번째 if문 (Spam and Cheese)

15번째 줄 세 번쨰 if문에서는 건너뛰기가 일어나지 않는다. True럌ㅋ('Spam')은 True이지만 and 연산자이기 때문에

오른쪽에 있는 표현식도 검사해 봐야 한다. 파이썬은 TrueFizz('Cheese')를 호출하고 이것은 'Cheese'를 출력한 다음 True를 반환한다.

if문의 조건은 True and True가 되며 전체적으로 True가 된다.


네 번째 if문 (Red and Blue)

18번째 줄 네 번째 if문에서는 건너뛰기가 일어난다. FalseFizz('Red')를 호출하면  'Red'가 출력되고 False를 반환한다.

and의 왼쪽 표현식이 False이므로 오른쪽에 뭐가 오든 상관없이 조건은 False가 된다. 따라서 TrueFizz('Blue')을 호출하지 않으므로

'Blue'를 출력하지 않는다. if 조건이 False이므로 'Step4'도 출력되지 않는다.


건너뛰기는 and 와 or을 포함하는 모든 표현식에서 발생할 수 있다.

건너뛰기가 일어나면 표현식 안에서 어떤 함수는 절대로 호출하지 않을 수 있다.

여러분이 건너뛰기를 모른다면 왜 그런 일이 발생하는지 영영 모를 수 있다.