본문 바로가기
언어/CS

[CS] 논리 연산의 단락 평가 (short-circuit evaluation)

by Geunny 2020. 7. 23.
반응형

코딩에 있어서 논리 연산은 정말 코딩의 꽃이라고 할 수 있다!

우리의 인생은 True와 False의 선택에서 살고 있다 해도 과언이 아니다..

 

마치 아침에 알람이 울렸을 때 알람을 듣고 깰지.. 끄고 더 잘 것인지에 대한 판단 또한 논리 연산이라 말할 수.. 있다..ㅋㅋ

 

암튼 이게 중요한 것이 아니라

오늘은 논리 연산 시에 일어나는 단락 평가 (short-circuit evaluation)에 대해서 알게 된 내용을 정리할 것이다.

 

먼저 단락 평가란 두 개 이상의 논리 연산을 진행할 때 첫 번째 값만으로 결과가 확실할 때 두 번째 값은 확인(평가) 하지 않는 방법을 말한다.

 

 

먼저 논리 연산에는 다음과 같이 4가지가 존재한다.

&& (and 연산) 두 논리값이 모두 True일 때 True return
|| (or 연산) 두 논리값중 하나가 True일 때 True return
^ (xor 연산) 두 논리값이 서로 다를 때 True return
! (not 연산) 논리값의 반대값 return
(True-> False, False->True

 

이렇게 말로만 표현하면 모르니 우리는 코딩을 하는 사람이 코드로 이야기해보자.

 

print(False and True)
print(False and False)

 

&& 연산은 두 값이 모두 true 일 때만 True return을 하므로 위에 두 코드는 아래와 같이 False 결과가 나온다.

코드 결과

위에 코드는 and 연산에서 첫 번째 값이 False 이므로 and 뒤의 값과는 상관없이 무조건 False 가 나오게 된다.

 

|| 연산 또한 두 값 중 하나가 True 일 때만 True return을 하므로 아래 두 코드 또한 무조건 True가 나오게 된다.

print(True or True)
print(True or False)

코드 결과

이 두 가지처럼 && 연산은 첫 번째 값이 False 일 때, || 연산은 첫 번째 값이 True 일 때 뒤에 값과는 상관없이 무조건 각각 False와 True를 반환하게 되어 뒤에 연산은 진행하지 않는다.

 

따라서 다음과 같이 뒤에나 어떤 짓을 해도 연산을 하지 않게 된다.

뒤에는 연산안함..

근데 이게 무엇이 문제냐!

 

바로 파이썬은 이런 논리 연산자는 이 단락 평가에 따라 반환하는 값이 결정이 된다는 특징이 있다.

 

다음 코드를 실행했을 때 문제가 생긴다.

 

엄연히 문자열 'Python'도 불로 따지면 True라서 True and True로 True 가 나올 것 같지만 'Python' 이 나온다. 왜냐하면 파이썬에서 논리 연산자는 마지막으로 단락 평가를 실시한 값을 그대로 반환하기 때문이다. 따라서 논리 연산자는 무조건 불을 반환하지 않는다.

 

다음과 같이 마지막으로 단락 평가를 실시한 값이 불이면 불을 반환하게 된다.

여기서 문자열 'Python'을 'True'로 쳐서 and 연산자가 두 번째 값까지 확인하므로 두 번째 값이 반환된다. 만약 다음과 같이 and 연산자 앞에 False 나 False로 치는 값이 와서 첫 번째 값 만으로 결과가 결정 나는 경우에는 첫 번째 값이 반환된다.

or 연산자도 마찬가지로 마지막으로 단락 평가를 실시한 값이 반환된다. 다음은 or 연산자에서 첫 번째 값만으로 결과가 결정되므로 첫 번째 값이 반환된다.

만약 두 번째 값까지 판단해야 한다면 두 번째 값이 반환된다.

 

이러한 단락 현상은 자바에서도 발견할 수 있다.

 

public class Evaluation {
	
	public static void main(String[] args) {
		
		boolean a;
		
		System.out.println(true || false);
		System.out.println(true || true);
		System.out.println(true || a);
	}
}

 위 코드는 사실상 boolean 변수 a를 초기화시켜주지 않아 컴파일 오류가 나와야 하지만 단락 평가로 인해 3번째 println에서 컴파일 에러가 발생하지 않는다.

 

위 코드를 실행하면 모두 true 값을 출력한다.

True~

 

이 단락 평가를 다시 공부하면서 예전 JS를 이용해 게임 만들었을 때 버그가 났었던 것이 생각이 났다..

 

핀볼 게임을 만들었는데 가끔 공이 핀에 맞아도 핀을 통과해버리는 일이 있었는데 

 

그때 저 단락 평가 때문에 if문이 제대로 돌지 않았던 것 같다..

 

이러한 단락 평가로 인해 제어문이 잘 돌아가지 않도록

 

논리 연산을 할 때 && 연산의 앞에는 False 값이 오지 않도록, || 연산의 앞에는 True 값이 오지 않도록 구성을 잘해야 할 것이다..

'언어 > CS' 카테고리의 다른 글

[CS] 부동소수점 오류  (0) 2020.07.22

댓글