논리연산자는 true, false를 대상으로 연산을 하여 true나 false를 결과로 내놓는 연산자이다.
- AND : && => 두개가 다 TRUE면 결과도 TRUE, 반대로 말하면 하나라도 FALSE이면 그건 FALSE
- OR : || => 두개가 다 FALSE면 결과도 FALSE, 반대로 말하면 하나라도 TRUE이면 그건 TRUE
- NOT : ! => TRUE는 FALSE로 , FALSE는 TRUE로.. 청개구리
- XOR : ^ => 배타적 논리합이라는데 쉽게 말하면 둘다 같으면 FALSE, 둘이 다르면 TRUE이다.
이렇게 종류가 있다.
단축평가란 무엇인가를 알아보자.
영어로는 Short Circuit 라고한다. 바로 예제를 보는게 이해가 빠를것 같다.
if( a==1 && b==2 ) {
.... ..... ......
}
위 조건문을 보았을때 &&연산자는 좌변(a==1)과 우변(b==2)이 모두 true 일때 결과값이 true 가 된다.
만일 a==1 이 false 라면 뒤는 볼 필요도 없이 결과값은 false 이다.
즉 컴파일러는 a==1 이 false 일땐 우변은 평가하지도 않고 전체값을 리턴한다.
불필요한 연산을 줄여 실행속도를 높이려는 것으로 아마 C언어 공부할 때 배웠던 것 같다.
라고 생각할 수도 있겠다. 적어도 나는 그렇게 생각했다.
그런데 만약 조건 평가가 생략되는 우변이 프로그래밍 흐름 상 어떤 역할을 하는 함수 호출문이라면 굉장한 차이가 생길 수도 있을 것이다.
그리고 이것은 안정성을 높이는데 사용이 될 수도 있다.
if( (a!=0) && (b/a == 1) {
명령문들;
}
단축평가가 있음으로써 위 코드는 0으로 나누어지는 치명적인 예외상황을 겪지 않을 것이다.
만일 단축평가가 없다면 아래와 같이 코드를 작성해야 할것이다.
if(a!=0){
if(b/a==1){
명령문;
}
}
음.. 작성하고보니 위 두 예제는 사실 크게 차이는 없는것 같지만 몇글자라도 더 줄어들지 않았는가!?
또한 이런 상황을 가정해보자. 두 조건문 A, B를 논리연산자를 사용해 평가를 하고 싶다.
A는 연산수행시간이 얼마 안걸리는 단순조건, B는 연산시간이 무척 오래걸리는 복잡다단한 조건문이라고 생각해보자.
// 첫번째 경우
if( A && B ) {....}
//두번째 경우
if( B && A) {....}
서술하는 순서만 다르고 결과는 같은 위 두 경우는 엄청난 차이가 있다. 만약 두번째 경우에서 엄청난 시간이 걸려 B조건문을 평가하고 나서 뒤에 A조건문을 평가하였는데 A가 거짓이라면? B 연산을 수행한 시간은 의미가 없어진다.
결론 : 위 예제는 좀 극단적이라 사실 실제 저렇게 할 일이 많을진 모르겠다. 일단 현재 내 수준에서는 그렇다.ㅎㅎ;
그렇더라도 코딩할때 단순하고 쉽게 조사할 수 있는 조건문이나 가급적 반드시 실행해야할 조건문들을 앞쪽에 배치하는 습관을 들여야 겠다!!😋