여러분이 C나 C++ 또는 자마(Java) 프로그래머라면 대부분의 자바스크립트 연산자들이 이미 친숙할 것이다. 표 5-1에 이 연산자들을 정리해두었으니 참고하라.
대부분의 연산자들은 +나 -와 같은 문장부호로 표현되지만, 일부는 delete나 instanceof와 같이 키워드로
표현된다. 키워드 연산자들도 문장부호 연산자들과 마찬가지로 정규 연산자이며 그저 좀 더 읽기 쉽고 덜
간결한 형태로 표현된 것뿐이다.
표 5-1에서 'P'라고 표시된 열은 연산자 우선순위를 나타내며, 'A'라고 표시된 열은 연산자의 결합 방향을
나타낸다. 아직 우선순위와 결합 방향의 개념을 모른다면 표 다음에 이어지는 설명을 보라. 연산자 자체에
대한 설명은 그 다음에 정리되어 있다.
표 5-1 자바스크립트 연산자
P | A | 연산자 | 피연산자 타입 | 수행되는 연산 |
15 | L | . | 객체, 식별자 | 프로퍼티 접근 |
L | [ ] | 배열, 숫자 | 배열 인덱스 | |
L | ( ) | 함수, 전달인자 | 함수 호출 | |
R | new | 생성자 호출 | 새 객체 생성 | |
14 | R | ++ | 좌변값(lvalue) | 전치 또는 후치 증가 (단항 연산) |
R | -- | 좌변값 | 전치 또는 후치 감소 (단항 연산) | |
R | - | 숫자 | 단항 마이너스 (부정) | |
R | + | 숫자 | 단항 플러스 (연산 없음) | |
R | ~ | 정수 | 비트 단위 NOT (단항 연산) | |
R | ! | 불리언 | 논리 NOT (단항 연산) | |
R | delete | 좌변값 | 프로퍼티 정의를 무효화 (단항 연산) | |
R | typeof | 타입 무방 | 데이터 타입을 반환 (단항 연산) | |
R | void | 타입 무장 | undefined 값을 반환 (단항 연산) | |
13 | L | *, /, % | 숫자 | 곱하기, 나누기, 나머지 |
12 | L | +, - | 숫자 | 더하기, 빼기 |
L | + | 문자열 | 문자열 이어 붙이기 | |
11 | L | << | 숫자 | 왼쪽으로 이동 |
L | >> | 숫자 | 부호 비트를 확장하면서 오른쪽으로 이동 | |
L | >>> | 숫자 | 부호 비트를 확작 없이 오른쪽으로 이동 | |
10 | L | <, <= | 숫자 또는 문자열 | 작다, 작거나 같다 |
L | >, >= | 숫자 또는 문자열 | 크다, 크거나 같다 | |
L | instanceof | 객체, 생성자 | 객체 타입 확인 | |
L | in | 문자열, 객체 | 프로퍼티가 존재하는지 확인 | |
9 | L | == | 타입 무방 | 동등한지 테스트 |
L | != | 타입 무방 | 동등하지 않은지 테스트 | |
L | === | 타입 무방 | 일치하는지 테스트 | |
L | !== | 타입 무방 | 일치하지 않는지 테스트 | |
8 | L | & | 숫자 | 비트 단위 AND |
7 | L | ^ | 슷자 | 비트 단위 XOR |
6 | L | | | 숫자 | 비트 단위 OR |
5 | L | && | 불리언 | 논리 AND |
4 | L | || | 불리언 | 논리 OR |
3 | R | ? : | 불리언, 타입 무방, 타입 무방 | 조건부 연산자 (3개의 피연산자) |
2 | R | = | 좌변값, 타입 무방 | 할당 |
R | *=, /=, %=, +=, | 좌변값, 타입 무방 | 연산을 수반하는 할당 | |
-=, <<=, >>=, | ||||
>>>=, &=, ^=, |= | ||||
1 | L | , | 타입 무방 | 복수의 평가(multiple eval!uation) |
1. 피연산자 개수
연산자가 가정하는 피연산자의 개수에 따라 연산자들을 분류해 볼 수 있다.
앞에서 소개한 + 연산자처럼 자바스크립트 연산자는 대부분 2항 연산자(binary operator)다.
2항 연산자는 두 개의 표현식을 조합하여 하나의 더 복잡한 표현식으로 만들어낸다.
바꿔 말하면 2항 연산자는 두 개의 피연산자에 대해 연산을 수행한다. 또한 자바스크립트는 단항 연산자(unary operator)도 지원한다. 단항 연산자는 하나의 표현식을 하나의 더 복잡한 표현식으로 변환한다.
-3과 같은 표현식의 - 연산자가 단항 연산자로, 피연산자의 3의 부호를 전환한다.
마지막으로 자바스크립트는 단 하나의 3항 연산자도 지원하는데, 바로 조건부 연산자인 ?: 이다.
이는 3개 표현식들의 값을 조합하여 하나의 표현식으로 만들어낸다.
2. 피연산자 타입
자바스크립트 표현식을 작성할 때에는 연산자에 전달되는 데이터 타입과 그로부터 반환되는 데이터 타입을 주의해야 한다. 피연산자 표현식으로부터 산출되는 값이 특정 데이터 타입일 것을 전제하는 연산자들이 있기 때문이다. 예를 들어 문자열은 곱할 수 없다. 따라서 "a" * "b"와 같은 표현식은 자바스크립트에서 올바르지
않다. 하지만 자바스크립트에는 가능한 적절한 타입으로 표현슥을 변환하려 시도한다. 그렇기 때문에 "3" * "5" 와 같은 표현식은 적법하다. 이 표현식의 값은 문자열 "15"가 아니라 숫자 15이다. 자바스크립트 타입 변환은 3.12절에서 자세하게 다룬 바 있다.
게다가 몇몇 연산자들은 적용되는 피연산자의 타입에 따라 다르게 작용한다. 대표적으로 + 연산자는 숫자 타입 피연산자들에 대해 덧셈을 하지만 문자열타입 피연산자들끼리는 이어 붙이기를 한다. 또한 문자열 하나의 숫자 하나를 전달 받을경우, 숫자를 문자열로 변환하여 얻어진 문자열을 원래의 문자열과 이어 붙인다. 한 예로 "1" + 0은 문자열 "10" 을 내놓는다.
할당 연산자나 다른 몇 가지 연산자에서는 좌변의 표현식이 좌변항(lvalue)이라고 가정한다. 좌변항이란 '할당 표현식의 좌변에 적법하게 나타날 수 있는 표현식'에서 유래한 용어다. 자바스크립트에서는 변수, 객체 프로퍼티, 배열 원소가 좌변항이다. ECMAScript 명세에 의하면 좌변항을 반환하는 내장 함수도 좌변항의 한 종류로 허용하고 있으나, 정작 실제로 그런 형태로 정의된 내장 함수는 하나도 없다.
마지막으로, 연산자가 반환하는 타입이 피연산자의 타입과 항상 같은 것은 아니다.
비교 연산자(더 작다, 더 크다 등)은 다양한 타입의 피연산자를 받지만, 비교 표현식을 평가하면 언제나
그 비교가 참인지 거짓인지 가리키는 기본 불리언 타입의 값을 얻는다. 예를 들어 a < 3 표현식은 변수 a의
값이 3보다 작을 경우 true를 반환한다. 앞으로 접하게 될 테지만, 이러한 비교 연산자가 반환하는 불리언 값들은 if 문, while 루프, for 루프(비교 연산자가 포함된 표현식의 평가 결과에 따라 프로그램을 실행을
제어하는 자바스크립트 구문)에서 사용된다.
3. 연산자 우선순위
표 5-1에서 'P'라고 표시된 열은 각 연산자의 우선순위를 지정한다고 했다.
연산자 우선준위란 연산이 수행되는 순서를 제어하는 것을 말한다.
'P' 열에서 더 높은 값이 부여된 연산자들이 낮은 숫자의 연산자들보다 먼저 수행된다.
다음의 표현식을 살펴보자.
곱셈 연산자 *는 덧셈 연산자 +보다 우선순위가 높다. 따라서 곱셈이 덧셈보다 먼저 수행된다.
또한 할당 연산자 =는 가장 낮은 순위에 있기 때문에 우변의 모든 연산이 완료된 후에야 할당 연산이
수행된다. 원래 정해진 연산자 우선순위를바꾸려면 확실하게 괄호를 쓰면 된다.
앞의 예에서 덧셈을 강제로 먼저 수행하려면 다음과 같이 쓰면 된다.
실전에서 여러분이 사용하는 연산자 우선순위에 대해 확신이 가지 않는다면, 가장 간단한 해결책은 괄호를
써서 연산 순서를 명시적으로 못 박는 것이다. 단 한 가지 알아둘 중요한 규직은 다음과 같다. 곱셈 나눗셈은 덧셈, 뺄셈보다 먼저 수생되며, 할당은 우선순위가 아주 낮기 때문에 대부분의 경우 마지막으로 수행된다.
4. 연산자 결합 방향
표 5-1에서 'A'라고 표시된 열은 연산자 결합 방향을 지정한다고 했다.
L 표시는 왼쪽에서 오른쪽으로의 결합 방향을, R 표시는 오른쪽에서 왼쪽으로의 결합 방향을 나타낸다.
연산자의 결합 방향이 지정하는 것은 동일 우선순위 연산들이 수행되는 순서다.
왼쪽에서 오른쪽으로의 결합 방향은 연산이 왼쪽에서 오른쪽으로 일어남을 말한다.
예를 들어 덧셈 연산자는 결합 방향이 왼쪽에서 오른쪽이기 때문에,
위의 표현식은 다음과 동일하다.
반면, 다음의 (거의 의미는 없다시피 한)표현식들은,
w = x = y = z;
q = a?b:c?d:e?f:g;
다음의 표현식들과 동일하다.
w = (x = (y = z));
q = a?b:(c?d:(e?f:g));
위와 같이 되는 이유는 단항, 할당, 3항 비교 연산자들의 결합 방향이 오른쪽에서 왼쪽이기 때문이다.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 5.4 동등 연산자 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 5.3 산술 연산자 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 5.1 표현식 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 4.7 변수의 유효 범위 (재해석) (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 4.6 변수와 프로퍼티 (0) | 2010.07.04 |