ECMAScript Boolean 연산자

Boolean 연산자는 프로그래밍 언어가 원활하게 작동하는 데 매우 중요합니다.

Boolean 연산자는 NOT, AND, OR 세 가지가 있습니다.

ToBoolean 연산

다양한 논리 연산자를 배우기 전에, ECMAScript-262 v5 표준에서 설명된 ToBoolean 연산을 먼저 이해해보겠습니다.

추상적인 연산 ToBoolean은 다음 표의 규칙에 따라 매개변수를 논리 값으로 변환합니다:

매개변수 타입 결과
Undefined false
Null false
Boolean 결과는 입력된 매개변수와 동일합니다 (변환하지 않음)
Number 매개변수가 +0, -0 또는 NaN이면 결과는 false, 그렇지 않으면 true입니다.
String 매개변수가 빈 문자열이면 결과는 false, 그렇지 않으면 true입니다.
Object true

로직 NOT 연산자

ECMAScript에서 논리 NOT 연산자는 C와 Java의 논리 NOT 연산자와 같으며, 모두感叹호(!)로 표시됩니다.

논리 OR와 논리 AND 연산자와 달리,논리 NOT 연산자는 항상 Boolean 값을 반환합니다.

논리 NOT 연산자의 동작은 다음과 같습니다:

  • 연산자가 객체라면 false를 반환합니다
  • 연산자가 숫자 0이라면 true를 반환합니다
  • 연산자가 0 이외의 어떤 숫자라면 false를 반환합니다
  • 연산자가 null이라면 true를 반환합니다
  • 연산자가 NaN이라면 true를 반환합니다
  • 연산자가 undefined라면 오류가 발생합니다

보통, 이 연산자는 루프를 제어하는 데 사용됩니다:

var bFound = false;
var i = 0;
while (!bFound) {
  if (aValue[i] == vSearchValues) {
    bFound = true;
  } else {
    i++;
  }
}

이 예제에서, Boolean 변수(bFound)는 검색이 성공했는지 기록하는 데 사용됩니다. 데이터 항목을 찾으면 bFound이 true로 설정되고, !bFound은 false로 되어 있어 while 루프가 종료됩니다.

ECMAScript 변수의 Boolean 값을 판단할 때, 논리 NOT 연산자도 사용할 수 있습니다. 이렇게 하려면 한 줄 코드에서 두 NOT 연산자를 사용해야 합니다. 연산자의 타입이 무엇이든, 첫 번째 NOT 연산자는 Boolean 값을 반환합니다. 두 번째 NOT는 해당 Boolean 값을 음의로 변환하여 변수의 실제 Boolean 값을 제공합니다.

var bFalse = false;
var sRed = "red";
var iZero = 0;
var iThreeFourFive = 345;
var oObject = new Object;
document.write("bFalse의 논리 값은 " + (!!bFalse));
document.write("sRed의 논리 값은 " + (!!sRed));
document.write("iZero의 논리 값은 " + (!!iZero));
document.write("iThreeFourFive의 논리 값은 " + (!!iThreeFourFive));
document.write("oObject의 논리 값은 " + (!!oObject));

결과:

bFalse의 논리 값은 false입니다
sRed의 논리 값은 true입니다
iZero의 논리 값은 false입니다
iThreeFourFive의 논리 값은 true입니다
oObject의 논리 값은 true입니다 

논리 AND 연산자

ECMAScript에서 논리 AND 연산자는 이중 약과 기호(&&)로 표시됩니다:

예를 들어:

var bTrue = true;
var bFalse = false;
var bResult = bTrue && bFalse;

논리 AND 연산자의 행동을 설명하는 진리 표는 다음과 같습니다:

연산자 1 연산자 2 결과
true true true
true false false
false true false
false false false

논리 AND 연산자의 연산자는 Boolean 값 이외의 모든 유형이 될 수 있습니다.

연산자 중 하나가 원시 Boolean 값이 아니면, 논리 AND 연산이 항상 Boolean 값을 반환하지 않습니다:

  • 연산자 중 하나가 객체이고 다른 하나가 Boolean 값이면 해당 객체를 반환합니다.
  • 두 연산자 모두 객체이면 두 번째 객체를 반환합니다.
  • 연산자 중 하나가 null이면 null을 반환합니다.
  • 연산자 중 하나가 NaN이면 NaN을 반환합니다.
  • 어떤 연산 값이 undefined이면 오류가 발생합니다.

Java에서의 논리 AND 연산과 유사하게, ECMAScript에서의 논리 AND 연산도 간단한 연산입니다. 즉, 첫 번째 연산자가 결과를 결정하면 두 번째 연산자를 더 이상 계산하지 않습니다. 논리 AND 연산에서 첫 번째 연산자가 false이면, 두 번째 연산자의 값이 무엇이든 결과는 true일 수 없습니다.

다음 예제를 고려해 보세요:

var bTrue = true;
var bResult = (bTrue && bUnknown); // 오류 발생
alert(bResult); // 이 줄은 실행되지 않습니다

이 코드는 논리 AND 연산을 수행할 때 오류를 발생시킵니다. 이는 변수 bUnknown이 undefined인 탓입니다. 변수 bTrue의 값은 true이며, 논리 AND 연산은 변수 bUnknown을 계산합니다. 이렇게 하면 bUnknown의 값이 undefined이기 때문에 논리 AND 연산에 사용할 수 없어 오류가 발생합니다.

이 예제를 수정하여 첫 번째 값을 false로 설정하면 오류가 발생하지 않습니다:

var bFalse = false;
var bResult = (bFalse && bUnknown);
alert(bResult); // "false" 출력

이 코드에서 스크립트는 논리 AND 연산 결과 값을 출력합니다. 즉 문자열 "false"입니다. 변수 bUnknown의 값이 undefined이면, 첫 번째 연산자의 값이 false이기 때문에 계산되지 않습니다.

ヒント:논리 AND 연산자를 사용할 때는 그 간단한 계산 특성을 기억해야 합니다.

논리 OR 연산자

ECMAScript의 논리 OR 연산자는 Java의 것과 동일하게, 양단점(||)로 표시됩니다:

var bTrue = true;
var bFalse = false;
var bResult = bTrue || bFalse;

아래의 진리 표는 논리 OR 연산자의 동작을 설명합니다:

연산자 1 연산자 2 결과
true true true
true false true
false true true
false false false

논리 AND 연산자와 비슷하게, 어떤 연산 값이 Boolean 값이 아니어도 논리 OR 연산은 반드시 Boolean 값을 반환하지 않습니다:

  • 어떤 연산 값이 객체이고 그 객체 왼쪽의 연산 값이 모두 false인 경우 해당 객체를 반환합니다.
  • 두 개의 연산 값이 모두 객체인 경우 첫 번째 객체를 반환합니다.
  • 마지막 연산 값이 null이고 다른 연산 값이 모두 false인 경우 null을 반환합니다.
  • 마지막 연산 값이 NaN이고 다른 연산 값이 모두 false인 경우 NaN을 반환합니다.
  • 어떤 연산 값이 undefined이면 오류가 발생합니다.

논리 AND 연산자와 마찬가지로, 논리 OR 연산도 간단한 연산입니다. 논리 OR 연산자에서는 첫 번째 연산 값이 true인 경우 두 번째 연산 값을 더 이상 계산하지 않습니다.

예를 들어:

var bTrue = true;
var bResult = (bTrue || bUnknown);
alert(bResult);			// "true"이 출력됩니다

이전 예제와 동일하게, 변수 bUnknown는 정의되지 않았습니다. 그러나 변수 bTrue의 값이 true이므로, bUnknown는 계산되지 않으며, "true"이 출력됩니다.

bTrue을 false로 변경하면 오류가 발생합니다:

var bFalse = false;
var bResult = (bFalse || bUnknown);	// 오류가 발생합니다
alert(bResult);			// 이 줄은 실행되지 않습니다