표현식과 연산자

2014. 10. 13. 13:12 나홀로스터디/JS 완벽가이드


5장 표현식과 연산자

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
5.1 표현식
5.2 연산자 개요
5.3 산술 연산자
5.4 동등 연산자
5.5 관계연산자
5.6 문자열 연산자
5.7 논리 연산자
5.8 비트 단위 연산자
5.9 할당 연산자
5.10 기타 연산자들


5.1 표현식
표현식이란 자바스크립트 인터프리터가 계산하여 값을 구할 수 있는 자바스크립트 구절로 가장 간단한 표현식은 리터럴 또는 변수의 이름이다.  리터럴 표현식의 값은 그 리터럴 값 자신이고 변수 표현식의 값은 해당 변수가 저장하거나 참조하는 값이다.



5.2 연산자 개요
대부분의 연산자는 + 나 - 와 같은 문장부호로 표현되지만 일부는 delete나 instanceof와 같이 키워드로 표현된다.


5.2.1 피연산자 개수

2항 연산자는 두 개의 표현식을 조합하여 하나의 더 복잡한 표현식으로 만들어 내기도 하고 단항 연산자를 지원하기도 한다.

5.2.2 피연산자 타입

피연산자 표현식을 작성할 때는 연산자에 전달되는 데이터 타입과 반환되는 데이터 타입을 주의해야 한다.
'a', 'b' 와 같은 문자열은 곱할수 없지만 자바스크립트에서는 가능한 적절한 타입으로 표현식을 반환하려고 시도한다.
+ 연산자는 숫자 타입 피연산자들에 대해 덧셈을 하지만 문자열타입 피연산자들끼리는 이어 붙이기를 한다.
비교 표현식을 평가하면 언제가 그 비교가 참인지 거짓인지 가리키는 기본 불리언 타입 값을 얻는다.

5.2.3 연산자 우선순위
연산자 우선순위란 연산이 수행되는 순서를 말한다. 원래 정해진 연산자 우선순위를 바꾸려면 확실하게 괄호를 쓰면된다.

5.2.4 연산자 결합 방향

단항, 할당, 3항 비교 연산자들의 결합 방향은 오른쪽에서 왼쪽으로 이루어진다.



5.3 산술 연산자

덧셈( + )
+ 연산자는 숫자 타입 피연산자의 덧셈이나 문자열 타입 피연산자의 이어 붙이기에 쓰이는데 만일 하나의 피연산자가 문자열이라면 나머지 하나의 피연산자를 문자열로 변환한후 이어붙인다.  객체 피연산자는 더하거나 이어 붙일수 있게 숫자나 문자열로 변환하는데 이 변환은 객체의 valueOf() 메서드나 toString() 메서드에 의해 수행된다.

뺄셈( - )
- 연산자가 2항 연산자로 쓰일 경우 첫 번째 피연산자에서 두번째 피연산자를 뺀다. 피연산자가 숫자타입이 아닐경우 먼저 숫자타입으로 변환을 시도한다.

곱셉( * )
* 연산자는 두 연산자를 곱하는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.

나눗셈( / )
/ 연산자는 첫번째 연산자를 두번째 연산자로 나누는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.
자바스크립트에서는 모든 숫자가 부동소수점으로 취급된다.
0으로 나누는 연산결과는 양의 무한대, 또는 음의 무한대가 되며 0/0의 결과는 NaN이 된다.

나머지( % )
% 연산자는 첫번째 피연산자를 두번재 피연산자로 나누고 남은 나머지를 반환한다. 피연산자가 숫자타입이 아닌경우 먼저 숫자타입으로 변환을 시도한다.

단항 마이너스( - )
- 가 하나의 피연산자 앞에서 단항 연산자로 쓰이면 단항 부정을 수행한다.
양수값을 같은 크기의 음수값으로, 음수값은 같은 크기의 양수 값으로 바꾼다.

단항플러스( + )
숫자 리터럴 부호를 명시적으로 지정할수 있게 해준다.
+ 연산자는 전달인자를 숫자 타입으로 변환하는 효과가 있고 전달인자가 변환될수 없는 경우 NaN을 반환한다.

증가( ++ )
++ 연산자는 단항 피연산자에 대해 증가 연산을 수행하는데 피연산자는 변수, 배열, 원소 또는 객체 프로퍼티 중 하나여야한다. 이것이 아닐경우 ++ 연산자는 일단 숫자타입으로 변환을 시도한다.
이 연산자의 정확한 작동은 피연산자의 어느쪽에 연산자가 놓여 있는가에 따라 앞에서 사용될 경우 전치증가 연산자라 부르며 피연산자의 뒤에서 사요오딜 경우 후치증가 연산자라고 부른다.

감소( -- )
-- 연산자는 단항 피연산자에 대해 감소 연산을 수행한다.



5.4 동등 연산자
== 연산자와 === 연산자 모두 두 값이 같은지 확인하는데 쓰이지만 '같다' 는 것을 정의하는 기준이 서로 다르다.
두 연산자 모두 피연산자의 타입을 가리지 않으며 주어진 피연산자가 같으면 true 를, 다르면 false 를 반환한다는 점에서 공통적이다. = 는 '취하다' 또는 '할당하다',  == 는 '~와 동등하다', === 는 '~와 일치한다'라고 읽는다.

반면 객체, 배열, 함수는 '참조에 의해' 비교된다. 두 변수가 같은 객체를 참조할 때에만 이 두 변수는 동등하다고 말하는 것이다.

5.4.2 부등(!=)과 불일치(!==)

부등 연산자 != 는 두 값이 서로 동등할 경우 false를 반환하며 그렇지 않을 경우 true를 반환한다.
불일치 연산자 !== 는 두 값이 서로 일치할 경우 false를 반환하며 그렇지 않을경우 true를 반환한다.




5.5 관계연산자
이 연산자들은 두 값의 관계를 테스트하고 해당 관계가 존재하는지 여부에 따라 true 또는 false를 반환한다.

5.5.1 비교 연산자
비교연산자는 두 값의 상대적인 순서를 판단하는데 쓰인다.

더 작다(<)
더 크다 (>)
더 작거나 같다(=<)
더 크거나 같다(<=)

문자열이 비교될 때에는 Unicode로 인코딩 된 각 문자에 해당하는 숫자값 기준으로 엄격히 문자대 문자로 비교된다.
인코딩 차이와 같은 다양성을 고려하는 문자열 비교 알조리즘으로 String.localeCompare() 메서드가 있다.


5.5.2 in 연산자
in연산자는 좌변의 피연산자로 문자열을 받는다. 우편의 피연산자로는 객체나 배열을 받는다.

5.5.3 instanceof 연산자
instanceof 연산자는 좌변의 피연산자로 객체를, 우변의 피연산자로 객체 클래스의 이름을 받는데 좌변 객체가 우변 클래스의 인스턴스일 경우 연산 결과는 true 이고 그렇지 않을 경우 false이다.




5.6 문자열 연산자
+ 연산자는 두 문자열 피연산자를 이어 붙인다.
<, <=, >, >= 연산자들은 두 문자열을 비교하여 그 순서를 판단하는데 비교의 기준은 알파벳 순서다.
+ 연산자는 숫자 피연산자보다 문자열 피연산자에 우선권을 부여한다.




5.7 논리 연산자

5.7.1 논리 AND(&&)
&& 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 AND를 수행하고 첫번째 피연산자와 두번째 피연산자가 모두 'true' 일 경우에만 연산결과로 true를 반환하므로 좌변 표현식의 값에 따라 우변 표현식을 평가할 수도 있고 평가하지 않을수도 있다.

5.7.2 논리 OR(||)
|| 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 OR을 수행하고 두 피연산자중 하나가 true 이거나 둘 다 true 일 경우 연산결과로 true를 반환한다.

5.7.3 논리 NOT(!)
! 연산자는 단항 연산자로 이 연산자는 단일 피연산자 앞에 놓인다.  이 연산자의 목적은 피연산자의 불리언 값을 반전, 즉 반대로 바꾸는 것이다.




5.8 비트 단위 연산자
비트 단위 연산자가 작용하는 것은 32비트 정수 표현법이다.




5.9 할당 연산자
= 연산자는 오른쪽 값을 왼쪽의 변수, 배열 원소, 객체 프로퍼티 등에 할당하므로 앞으로 이 변수, 원소, 프로퍼티 등을 사용하면 그 할당된 값을 참조하는 것이 된다.

할당 연산자의 연산자 결합 방향은 오른쪽에서 왼쪽이고 각 할당 표현식의 값은 우변의 값과 같다. 
  

i = j = k = 0;  





5.10 기타 연산자들

5.10.1 조건부 연산자(?:)
자바스크립트의 유일한 3항 연산자이다.
첫번째 연산자는 ? 앞에 위치하고 두번째는 ? 와 : 사이에 위치하며 세번재는 : 뒤에 위치한다.

x > 0 ? x * y : -x *  y; 

조건부 연산자의 첫번째 피연산자는 불리언 값이어야 하고 조건부 연산자가 반환하는 값은 첫 번째 피연산자의 불리언 값에 의해 결정되는데 그값이 true이면 조건부 표현식의 값은 두 번째 피연산자의 값이 되고 첫번재 피연산자의 값이 false이면 조건부 표현식의 값은 세 번재 피연산자의 값이 된다.

5.10.2 typeof 연산자
typeof 연산자는 단일 피연산자 앞에 위치하는 단항 연산자로 피연산자는 아무 타입이라도 무방하다.
이 연산자의 값은 피 연산자의 데이터 타입을 가리는 문자열로 피연산자가 숫자, 문자열, 불리언 값일 경우 typeof 연산자의 결과도 그에따라 "number", "string", "boolean" 이 된다. 객체, 배열, null에 대해서는 "object" 를 반환한다. 함수 타입의 피연산자에 대해서는 "function" 을, 정의되지 않은 피연산자는 "undefined"를 반환한다.

5.10.3 객체 생성 연산자(new)
new 연산자는 새로운 객체를 생성하고 이를 초기화하기 위한 생성자 함수를 호출한다.

new constructor(arguments); 

constructor는 반드시 생성자 함수로 평가되는 표현식이어야 하고 이에 따르는 전달인자는 괄호로 감싸야 하며 전달인자가 두개 이상일때는 쉽표로 구분한다. new 연산자에만 해당하는 특수한 경우로 자바스크립트에서는 함수 호출에 전달인자가 없을 경우 괄호를 생략할수 있는 간단한 문법을 지원한다.

o = new Object;  // 선택적으로  쓸수 있는 괄호가 생략됨
d = new Date();   //  현재 시간을 나타내는 Date 객체 반환
c = new Rectangle(3.0, 4.0, 1.5, 2.75)   // Rectangle 클래스의 객체 생성
obj = new constructor[i](); 

 
5.10.4 delete 연산자

delete 는 단항 연산자이며 피연산자로 지정된 객체 프로퍼티, 배열 원소 또는 변수의 삭제를 시도하는데 피연산자가 성공적으로 삭제되었을 경우 true를 반환하고 삭제될수 없는 경우 false를 반환한다.
한가지 중요한 점은, delete가 영향을 미치는 것은 오직 프로퍼티 뿐이며 해당 프로퍼티가 참조하고 있떤 객체는 무관하다는 것이다.

5.10.5 void 연산자
void는 단일 피연산자 앞에 쓰이는 단항 연산자로 피연산자의 타입은 아무 타입이라도 관계없다.
이 연산자는 피연산자의 값을 무시하고 undefined를 반환한다. 가장 일반적인 사용처는 클라이언트 측의 javascript: URL 사용으로 브라우저에 평가된 값을 표시하지 않으면서 표현식을 평가할 수 있게 해준다.

5.10.6 쉼표 연산자(,)
쉼표연산자는 왼쪽의 전달인자를 평가하고 오른쪽의 전달인자를 평가한 후 오른쪽 전달인자 값을 반환한다.

i = 0, j = 1, k = 2;

i = 0; j = 1; k = 2;

하나의 표현식만 허락되는 상황에서 부수 효과가 일어나는 다수의 개별 표현식들을 평가해야 할 경우에 사용한다.

5.10.7 배열과 객체 접근 연산자
배열 원소에 접근하는데에는 대괄호 [] 를 사용하고 객체의 원소에 접근하는 데에는 마침표(.)를 사용하면 된다.
[] 와 마침표(.) 모두 자바스크립트 연산자로 취급된다.
연산자는 좌변 피연산자로 객체를 받으며, 우변 피연산자로는 식별자(프로퍼티 이름)를 받는다. 우변 피연산자는 프로퍼티나 메서드의 이름에 해당하는 리터럴이어야 한다.

document["lastMdfified"]
frame[0]['length']
data["val" + i ] 

[]는 보통 배열의 원소에 접근하는데 사용된다. 프로퍼티 이름을 따옴표로 인용해야 하므로 객체 프로퍼티에 접근하는 용도로는 마침표(.) 연산자보다 불편한데 객체가 연관배열로 사용될경우 프로퍼티 이름이 동적으로 생성되며 이 경우에는 오직 [] 연산자만 사용할 수 있다.

5.10.8 함수 호출 연산자
() 연산자는 자바스크립트에서 함수 호출에 사용되고 피연산자의 개수가 정해져 있지 않다.

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

객체와 배열  (0) 2014.10.20
문장  (0) 2014.10.16
변수  (0) 2014.10.07
데이터 타입과 값  (0) 2014.10.01
어휘구조  (0) 2014.09.24
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET