TIL

190503_TIL(연산자)

연산자


표현식과 연산자

표현식

  • 표현식은 하나의 값으로 평가될 수 있는 문(expression statement)이다.

  • 표현식은 리터럴 표현식, 식별자 표현식, 연산자 표현식, 함수/ 메소드 호출 표현식 등으로 나누어 볼 수 있다.

  • 표현식결국 하나의 값이 되므로 표현식과 표현식이 평가되어 생성된 값은 동등한 관계, 즉 동치(Equivalent)이다. –> 표현식을 값처럼 사용할 수 있다.

    (값이 위치할 수 있는 자리에 표현식도 위치할 수 있다.)

    1
    2
    3
    4
    var score = 80;

    // 표현식 score + 10은 식별자 표현식과 숫자 리터럴 그리고 연산자의 조합으로 구성되어 있다.
    console.log(score + 10); // 90
  • 표현식은 다른 표현식의 일부가 되어 새로운 값을 만들어 낼 수 있다.


문과 표현식

  • 문(statement)은 하나 이상의 표현식과 키워드의 조합으로 구성된 자바스크립트 엔진에게 내리는 명령이다.
  • 문은 선언문, 표현식 문, 조건문 , 반복문 등으로 구분할 수 있다.
  • 자바스크립트의 모든 코드는 문 또는 표현식이다.
  • 표현식은 문을 구성하는 구(phrase)과 같은 요소이다. 표현식은 그 자체로 문이 될 수도 있다.
  • 표현식의 역할은 값을 생성하는 것이다. 의 역할은 표현식으로 생성한 값을 사용해 자바스크립트 엔진에게 명령을 내리는 것이다.

표현식인 문과 표현식이 아닌 문

  • 표현식인 문은 값으로 평가될 수 있는 문 , 표현식이 아닌 문은 값으로 평가될 수 없는 문이다,
  • 표현식인 문과 표현식이 아닌 문을 구별하기 위한 가장 간단하고 명료한 방법변수에 할당해 보는 것이다.
    • 표현식인 문은 값으로 평가되므로 변수에 할당할 수 있다.
    • 표현식이 아닌 문은 값으로 평가될 수 없으므로 변수에 할당할 수 없다.
1
2
3
4
5
6
7
8
9
10
// 변수 선언문은 표현식이 아닌 문이다.
var a;

// 할당문 자체가 표현식이지만 완전한 문이기도 하다. 즉, 할당문은 표현식인 문이다.

a = 10;


// 표현식이 아닌 문은 값처럼 사용할 수 없다.
var foo = var a; // SyntaxError: Unexpected token var
  • 크롬 브라우저 console 창에서 표현식이 아닌 문은 언제나 undefined를 출력한다. 이를 완료 값(Completion value)이라 한다.


연산자란?

  • 연산자(Operator)는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입 연산(Operation) 등을 수행해 하나의 값을 만든다.
  • 연산의 대상을 피연산자(Operand)라 한다.
  • 피연산자“값” 이라는 명사의 역할을 한다면 연산자는 “피연산자를 연산하여 새로운 값을 만든다” 라는 동사의 역할을 한다고 볼 수 있다.


산술 연산자

  • 산술 연산자(Arithmetic Operator)는 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다.
  • 산술 연산이 불가능한 경우 NaN을 반환한다.

이항 산술 연산자

  • 이항 산술 연산자는 2개의 피연산자를 산술 연산하여 숫자 타입의 값을 만든다.
이항 산술 연산자 의미 부수효과
+ 덧셈 X
- 뻴셈 X
* 곱셈 X
/ 나눗셈 X
% 나머지 X

단항 산술 연산자

  • 단항 산술 연산자는 1개의 피연산자를 산술 연산하여 숫자 타입의 값을 만든다.
  • 증가/감소(++ / –) 연산자는 피연산자의 값을 변경하는 부수 효과가 있다.
단항 산술 연산자 의미 부수 효과
++ 증가 O
감소 O
+ 효과x X
- 양수, 음수 변환 X
  • 증가 / 감소(++ / –) 연산자는 위치에 의미가 있다.

    • 피연산자 앞에 위치한 전위 증가/ 감소 연산자는 먼저 피연산자의 값을 증가 / 감소 시킨 후, 다른 연산을 수행한다.
    • 피연산자 뒤에 위치한 휘위 증가/ 감소 연산자는 먼저 다른 연산을 수행 후, 피연산자의 값을 증가 / 감소시킨다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var x = 5, result;

    // 선할당 후증가
    result = x++;
    console.log(result, x); // 5 6

    // 선증가 후할당
    result = ++x;
    cosole.log(result, x); // 7 7
  • + 단항 연산자는 숫자 타입이 아닌 피연산자를 숫자 타입으로 변환하여 반환한다. 주의할 점은 피연산자 자체를 변경하는 것이 아니라 숫자 타입으로 변환한 값을 생성해서 반환하는 것이다.

1
2
3
4
5
var x = '10';

console.log(x); // 10

console.log(+x); // "10"

문자열 연결 연산자

  • + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 문자열 연결 연산자
console.log('1' + 2); // '12'

// 산술 연산자
console.log(1 + 2); // 3

// true는 1로 타입 변환된다.
console.log(1 + true); // 2

// false는 0으로 타입 변환된다.
console.log(1 + false); // 1

// null는 0으로 타입 변환된다.
console.log(1 + null); // 1

// undefined는 숫자로 타입 변환되지 않는다.
console.log(+undefined); // NaN
console.log(1 + undefined); // NaN
  • 위 예제에서 1 + true 를 연산하면 자바스크립트 엔진은 암묵적으로 불리언 타입의 값인 true를 숫자 타입인 1로 타입을 강제 변환한 후 연산을 수행한다. 이를 암묵적 타입 변환(Implicit coercion) 또는 타입 강제 변환(Type coercion)이라고 한다.

할당 연산자

  • 할당 연산자(Assignment Operator)는 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다. 할당 연산자는 좌항의 변수에 값을 할당하므로 변수의 값이 변하는 부수 효과가 있다.
할당 연산자 사례 동일 표현 부수 효과
= x = 10 x = 10 O
+= x += 10 x = x +10 O
-= x -= 10 x = x - 10 O
*= x *= 5 x = x * 10 O
/= x /= 5 x = x / 5 O
%= x %= 5 x = x% 5 O
  • 할당 연산은 하나의 값으로 평가되는 표현식이다. 따라서, 할당 연산 표현식을 다른 변수에 할당할 수도 있다.

비교 연산자

  • 비교 연산자(Comparison Operator)는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 불리언 값을 반환한다. 비교 연산자는 if 문이나 for 문과 같은 제어문의 조건식에서 주로 사용한다.

동등 / 일치 비교 연산자

비교 연산자 의미 사례 설명
== 동등 비교 x == y x와 y의 값이 같음
=== 일치 비교 x === y x와 y의 값과 타입이 같음
!= 부동등 비교 x != y x와 y의 값이 다름
!== 불일치 비교 x !== y x와 y의 값과 타입이 다름
  • 동등 비교(==) 연산자는 피연산자를 비교할 때 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값을 갖는지 비교한다.
1
console.log(10 == '10'); // true
  • 동등 비교(==) 연산자는 예측하기 어려운 결과를 만들어 내기 때문에 가급적 사용을 지양하고 일치 비교(===) 연산자를 사용하는 것을 추천한다.
  • 다만, 일치 비교 (===) 연산자에서도 두 가지 주의해야 할 점이 있다.
1
2
3
4
5
6
7
8
9
10
11
// NaN은 자신과 일치하지 않는 유일한 값이다.
console.log(NaN === NaN); // false

// 숫자가 NaN 인지 조사하려면 빌트인 함수 isNaN을 사용
// 빌트인 함수 isNaN은 주어진 값이 NaN인지 체크하고 그 결과를 반환한다.
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false

// 양의 0과 음의 0의 비교. 일치 비교/동등 비교 모두 true이다.
console.log(0 === -0); // true
console.log(0 == -0); // true

대소 관계 비교 연산자

1
2
3
4
5
// 대소 관계 비교
console.log(7 > 0); // true
console.log(7 > 7); // false
console.log(7 >= 7); // true
console.log(7 <= 7); // true

삼항 조건 연산자

  • 삼항 조건 연산자(ternary operator)는 조건식의 평가 결과에 따라 반환할 값을 결정한다.
1
조건식 ? 조건식이 true 일 때 반환할 값 : 조건식이 false 일 때 반환할 값
  • ? 앞의 첫 번째 피연산자는 조건식, 즉 불리언 타입의 값으로 평가될 표현식이다. 조건식의 평가 결과과 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환된다.
1
2
3
4
5
6
var x = 10;

// 10 % 2는 0 이고 0은 false로 암묵적 타입 변환된다.
var result = x % 2 ? '홀수' : '짝수';

console.log(result); // 짝수
  • 삼항 조건 연산자는 if…else문을 사용해도 동일한 처리를 할 수 있다.

  • if…else문 과 삼항 조건 연산자의 차이점은 if…else문은 표현식이 아닌 문이고삼항 조건 연산자는 값으로 평가할 수 있는 표현식인 문이라는 것이다. 즉, 삼항 조건 연산자는 값으로 사용할 수 있고 다른 표현식의 일부가 될 수 있다.

논리 연산자

  • 논리 연산자(Logical Operator)는 우항과 좌항의 피연산자(부정 논리 연산자의 경우, 우항의 피연산자)를 논리 연산한다.
  • 논리 부정(!) 연산자는 언제나 불리언 값을 반환하지만 논리합(||) 연산자와 논리곱(&&) 연산자의 연산 결과는 불리언 값이 아닐 수도 있다.
논리 연산자 의미 부수효과
|| 논리합(OR) X
&& 논리곱(AND) X
! 부정(NOT) X
  • 논리합(||) 연산자는 피연산자 둘 중 하나만 true 값이면 true를 반환하고 논리곱(&&) 연산자는 피연산자 둘 모두 true인 경우에만 true를 반환한다. 부정(!) 연산자는 논리 연산 결과를 반대로 반환한다.

쉼표 연산자

  • 쉼표(,) 연산자는 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환한다.
1
2
3
var a, b, c;

a = 1, b = 2, c = 3; // 3

그룹 연산자

  • 그룹 연산자 (…)는 피연산자인 표현식을 가장 먼저 평가한다. 따라서 그룹 연산자를 사용하면 연산자의 우선 순위를 조절할 수 있다.
1
2
3
4
console.log(10 / 2 + 3); // 8

// 그룹 연산자를 사용하여 우선 순위 조절
console.log(10 / (2 + 3)); // 2

typeof 연산자

  • typeof 연산자는 자신의 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다. typeof 연산자가 반환하는 문자열은 7개의 데이터 타입과 일치하지는 않는다.

  • typeof 연산자는 7가지 문자열 “string”, “number”, “boolean”, “undefined”, “symbol”, “object”, “function” 중 하나를 반환한다. null을 반환하는 경우는 없다.

1
2
3
4
5
6
7
8
9
10
typeof ''              // "string"
typeof 1 // "number"
typeof NaN // "number"
typeof true // "boolean"
typeof undefined // "undefined"
typeof Symbol() // "symbol"
typeof null // "object"
typeof [] // "object"
typeof {} // "object"
typeof function () {} // "function"
  • 주의할 점은 typeof 연산자로 null 값을 연산해 보면 “null”이 아닌 “object”를 반환한다는 것이다. 따라서, null 타입을 확인할 때는 일치 연산자(===)를 사용하면 된다.
1
2
3
4
var x  = null;

console.log(typeof x === null); // false
console.log(x === null); // true
  • 또 하나 주의할 점은 선언하지 않은 식별자를 typeof 연산자로 연산하면 ReferenceError(참조에러)가 발생하지 않고 “undefined”를 반환한다는 것이다.
1
2
// 식별자 undeclared는 선언한 적이 없다.
console.log(typeof undeclared); // undefined

참고자료

Share