IT_Programming/JavaScript

자바스크립트 완벽가이드 - 5.7 논리 연산자

JJun ™ 2010. 7. 4. 19:49


논리 연산자는 보통 불리언 대수(Boolean algebra)를 수행한다.

 

논리 연산자는 종종 비교 연산자와 함께 사용되어 둘 이상의 변수가 관계되는 복잡한 비교식을 표현하기도

하는데, 이와 같은 형태는 if, while, for 문에서도 자주 쓰인다.

 

 

1. 논리 AND(&&)

 

&& 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 AND를 수행한다.

 

첫 번째 피연산자와 두 번째 피연산자가 '모두' true일 경우에만 연산 결과로 true를 반환한다.

적어도 하나 이상의 피연산자가 false라면 결과로 false를 반환한다.


이 연산자의 실제 작동은 다소 까다롭다. 이 연산자가 먼저 시작하는 것은 첫 번째 피연산자, 즉 연산자의

왼쪽에 위치한 표현식을 평가하는 일이다. 이 표현식의 값을 false로 변환할 수 있으면 (예를 들면 왼쪽의

피연산자가 null, 0, " ", 또는 undefined로 평가된 경우) 이 연산자는 바로 좌변 표현식의 값을 반환한다.

 

그 외의 경우 두 번째 피연산자, 즉 연산자의 오른쪽에 위치한 표현식을 평가한 후 그 표현식의 값을

반환한다.[각주:1]

이 연산자는 좌변 표현식의 값에 따라 우변 표현식을 평가할 수도, 하지 않을 수도 있음을 유의하라.

&& 연산자의 이러한 특성을 일부러 사용하는 코드를 이따금 보게 될 것이다. 예를 들어 다음 두 줄의

자바스크립트 코드가 가져오는 효과는 똑같다.

 

if (a == b) stop();
(a == b) && stop();


몇몇 프로그래머들은 (특히 펄 프로그래머들은) 위의 코드가 자연스럽고 유용하기도 한 프로그램 형식이라고 받아들일 테지만, 필자는 이와 같은 형식의 사용을 추천하고 싶지 않다. 우변 표현식이 평가되지 않을 수도 있다는 점으로 인해 많은 버그가 생겨나곤 한다. 다음의 예를 살펴보자.

 

if ((a == null) && (b++ > 10)) stop();

 

위 코드의 작동은 아마도 프로그래머가 의도한 것과 다를 수 있을 것이다. 왜냐하면 && 연산자 좌변의 비교식이 false이면 우변의 증가 연산자가 계산되지 않기 때문이다. 이 같은 문제를 피하려면, 여러분이 작성하는 코드의 작동을 정확히 알고 있다고 확신하지 않는 한 && 연산자의 우변에는 부수 효과가 일어나는 표현식(할당, 증가, 감소, 함수 호출)을 쓰지 말라.


이 연산자의 실제 작동은 꽤나 헷갈리는 방식임에 틀림없지만, 이 연산자를 그저 단순한 불리언 대수 연산자로 생각하는 것이 가장 간단하거니와 완벽히 안전하기도 하다. 이 연산자가 실제로 반환하는 것은 불리언 값이 아니지만 그 반환값은 언제나 불리언 값으로 변환될 수 있다.

         1) 자바스크립트 1.0과 1.1에서는 좌변 표현식이 false로 평가된 경우 && 연상자는 false를 번환한다.

            변환되지 않은 원래의 좌변 표현식 값을 반환하는 것이 아니다. [본문으로]

 

 

2. 논리 OR(||)

 

|| 연산자가 불리언 피연산자에 대해 쓰일 경우, 이 연산자는 두 값에 대한 불리언 OR를 수행한다. 두 피연산자 중 하나가 true이거나 둘 다 true일 경우 연산 결과로 true를 반환한다. 두 피연산자가 모두 false이면 결과로 false를 반환한다.


|| 연산자는 불리언 OR 연산자로 가장 널리 쓰이지만, && 연산자와 마찬가지로 실제 작동은 좀 더 복잡하다. 이 연산자가 먼저 시작하는 것은 첫 번째 피연산자, 즉 연산자의 왼쪽에 위치한 표현식을 평가하는 일이다.

이 표현식 값을 true로 변환할 수 있으면 이 연산자는 변환되지 않은 원래의 좌표 표현식 값을 반환한다.

 

그 회의 경우 두 번째 피연산자, 즉 연산자의 오른쪽에 위치한 표현식을 평가한 후 그 표현식의 값을

반환한다. [각주:1]


&& 연산자의 경우처럼, 여러분이 작성하는 코드의 작동을 정확히 알고 있다고 확신하지 않는 한

|| 연산자의 우변에 부수 효과가 일어나는 표현식을 사용하지 않는 것이 좋다.


|| 연산자에 대한 피연산자가 불리언 값이 아니라 하더라도 이 연산자는 여전히 불리언 OR 연산자로

간주될 수 있다. 왜냐하면 그 반환값이 어떤 타입이든 불리언 값으로 변환될 수 있기 때문이다.


여러분은 이 연산자의 반환값이 불리언이 아니라는 점을 사용하여 불리언 타입이 아닌 피연산자를 || 연산자에 사용하는 코드를 보게 될 것이다. 이러한 종류에 속하는 관용적인 용법은 여러 값 중, 정의되어 있으면서 null이 아닌 최초로 나오는 값을 택하는 방법이다.

 

다음의 예를 보라.

// max_width가 정의되었으면 이것을 사용한다. 그 외의 경우 preference 객체에
// 속한 값을 찾아본다.
// 그것조차 정의되어 있지 않을 경우 하드 코딩된 상수를 사용한다.
var max = max_width || preferences.max_width || 500;

 

             1) 자바스크립트 1.0과 1.1에서는 좌변 표현식이 true로 변환된 경우 || 연산자는 true를 반환한다.

                 변환되지 않은 원래의 좌변 표현식 값을 반환하는 것이 아니다. [본문으로]

 

 

 

3. 논리 NOT(!)

 

! 연산자는 단항 연산자다. 이 연산자는 단일 피연산자 앞에 놓인다.

이 연산자의 목적은 피연산자의 불리언 값을 반전, 즉 반대로 바꾸는 것이다.

예를 들어 변수 a의 값이 true일 경우 (또는 true로 변환되는 값일 경우) !a 값은 false이다.

또, 표현식 p && q가 false로 평가될 경우 (또는 false로 변환되는 값일 경우) !(p && q)는 true로 평가된다.

! 연산자는 피연산자를 반전하기에 앞서 필요에 따라 이를 불리언 값으로 변환한다.

(변환에 사용되는 규칙은 3장에서 설명하였다) 이것이 의미하는 바는 어떤값 x에 !!x와 같이 이 연산자를

두 번 적용함으로써 x에 해당하는 불리언 값을 얻을 수 있다는 것이다.