Updated:

연산자

프로그래밍에는 +나 * 등의 연산자를 사용하여 다양한 계산을 한다.

표현식과 연산자

표현식이란 결과적으로 어떤 값으로 평가(evaluation)되는 것이다. 이 말은 표현식의 값과 변수, 함수 등의 값을 바탕으로 식의 값을 계산하는 행위를 뜻한다.

3.14, "hello", true, false, null // 가장 간단한 표현식은 숫자, 문자열, 논리값 등의 원시 값(Primitive values)이다.
sum, circle.radius, a[3], square(5), card.getSum() // 변수, 프로퍼티, 배열 요소, 함수 호출, 메서드 호출도 표현식이다.

연산자(오퍼레이터, operator)를 사용하면 표현식을 조합혀여 더욱 복잡한 표현식을 만들어 낼 수 있다.

a + b

이 코드에서 +부분이 연산자이고 a와 b 부분은 연산 대상이 되는 피연산자(오퍼랜드, operand)라고 부른다. 연산자는 일반적으로 피연산자 개수에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 분류한다. + 연산자의 왼쪽과 오른쪽에는 피연산자가 총 두 개 있으므로 이항 연산자라고 부르고 -x의 - 연산자는 오른쪽에 피연산자 x 하나만 있으므로 단항 연산자이다. 삼항 연산자는 ?:뿐이다.

연산자의 우선순위

연산자가 여러 개 있을 때는 계산 순서에 따라 결과가 달라진다. 연산자에는 우선순위라는 것이 정해져 있고 우선순위에 따라 연산 순서가 정해진다.

연산자 결합 법칙

연산은 연산자 우선순위에 따라 진행되지만, 우선순위가 같은 연산자가 나열되어 있으면 연산 순서를 연산자 우선순위만으로는 결정할 수 없다. 이럴 때는 왼쪽과 오른쪽의 어떤 연산자와 결합해서 연산하는지에 따라 결과가 달라진다.

24 / 6 * 2

연산자에는 왼쪽과 결합해서 연산할지 아니면 오른쪽과 결합해서 연산할지를 결정하는 결합 법칙이 정해져 있다. 위 경우는 왼쪽에서 오른쪽 방향으로 결합한다.

연산자의 부수 효과

변수 값을 바꾸는 표현식을 일반적으로 부수 효과가 있는 표현식이라고 한다. 대입 연산자, 증가 연산자, 감소 연산자, delete가 부수 효과가 있는 연산자이다.

산술 연산

이 절에서는 사칙 연산이나 나머지 값 등의 산술 연산을 하는 연산자, 제곱근이나 삼각 함수 등의 수학 함수를 배운다.

산술 연산자

산술 연산자는 피연산자가 숫자인 연산자이다.
산술 이항 연산자
산술 이항 연산자는 +, -, *, /, %가 있다.
다음은 산술 이항 연산자를 쓸 때 몇 가지 주의할 사항이다.
① 정수끼리 나누어도 결과가 부동 소수점이 된다.

7 / 2 // 3.5

② 나머지 연산자 %의 피연산자는 부동소수점이다.

15 % 4    // 3
5 % 1.5   // 0.5

③ + 연산자는 피연산자 중 하나가 문자열이면 나머지 피연산자를 문자열로 만든다.

1 + "2month" // "12month"

④기타
계산할 수 없는 경우에는 NaN으로 평가한다. 또한 산술 연잔자의 피연산자가 true면 1, false와 null이면 0으로 평가한다. undefined면 NaN으로 평가한다.

산술 단항 연산자

연산자
++ 증가 연산자
감소 연산자
+ 아무것도 처리하지 않음
- 부호 반전

증가 연산자와 감소 연산자는 피연산자가 아에 표기하는 전위 표기법과 뒤에 표기하는 후위 표기법을 사용할 수 있다. 전위 표기법을 사용하면 피연산자 값을 바꾼 다음에 피연산자를 평가하고 후위 표기법을 사용하면 피연산자 값을 평가한 다음에 피연산자 값을 바꾼다.

a = 1;
b = ++a;      // b는 2가 되고 a는 2가 된다
c = a++ + 2;  // c는 4가 되고 a는 3이 된다

산술 대입 연산자
산술 대입 연산자는 +=, -=, *=, /=, %=이 있다.

Math 객체의 프로퍼티

자바스크립트에서는 지금까지 설명한 기본적인 산술 연산과 복잡한 수학적 연산을 지원하며, 이들은 Math 객체의 프로퍼티와 메서드에 포함되어 있다.

부동소수점과 정확도 문제

자바스크립트의 숫자는 IEEE754로 규정된 64비트 부동소수점이며, 이는 부호(1비트), 지수 부분(11비트), 가수 부분(52비트)로 64자리수의 2진수 부동소수점을 표현한다.
숫자를 자리수가 정해진 부동소수점으로 표현하여 계산하면 오차가 발생하는데 이것을 정확도 문제라고 한다. 일반적으로 값이 가까운 두 수를 뺄셈할 때 정확도 문제가 발생하는데 이를 정밀도 손실이라고 한다. 정밀도 손실을 피하려면 계산 과정을 다시 검토하여 크기가 비슷한 수의 뺄셈을 피하도록 해야 한다.

문자열 제어하기

문자열 처리와 산술 연산은 프로그램의 기본적인 데이터 처리이다.

문자열 연결

+ 연산자는 피연산자가 모두 문자열이면 문자열로 연결하고 피연산자 중 하나가 문자열 또는 문자열로 변환할 수 있는 객체라면 다른 피연산자의 타입을 문자열로 바꾼다음 연결한다.

"Hello" + "World!"    // "Hello World!"
10 + "little indians" // "10 little indians"
1 + {}                // "1[Object Object]"
true + (new Date())   // "trueTue Sat Aug 05 2017 22:38:59 GMT+0900 (KST)"

그렇지 않으면 피연산자 두 개를 숫자 또는 NaN으로 타입을 바꾸어 더한다. 이 경우는 자바스크립트의 실행 환경에 따라 처리하는 방법이 다르다.

문자열을 조작하는 메서드 #여기 다시 보기

문자열을 처리하기 위한 객체로 String 객체가 있다. 문자열을 String 객체로 변환하려면 String 생성자를 사용한다.

var msgObj = new String("Everything is practice.");

이처럼 원시 값을 객체로 변환하는 행위를 가리켜 원시 값을 객체로 래핑(wrapping)한다고 한다. 예를 들어 문자열의 길이는 배열과 마찬가지로 length 프로퍼티로 구할 수 있다.

msgObj.length // 23

이때 String 객체로 표시되는 문자열의 각 문자에는 왼쪽부터 순서대로 0부터 시작하는 번호가 매겨진다.

문자열을 배열로 읽고 쓰기

문자열을 읽을 떄는 chatAt 메서드 대신 대괄호 연산자를 사용할 수 있다. 그러나 배열처럼 값을 대입해서 수정할 수는 없다.

msg[3]            // "r"
msg[msg.length-1] // "."
msg[3] = "R";
cosole.log(msg);  // Everything is practice.

논리 연산자와 관계 연산자

이 절에서는 논리식(조건식)을 만드는 연산자인 논리 연산자와 관계 연산자를 배운다.

관계 연산자 # 다시보기

관계 연산자는 두 개의 피연산자를 비교한 결과를 논리값(true/false)으로 반환한다.

연산자
== 값이 같음
!= 값이 다름
=== 값과 타입이 같음
!=== 값과 타입이 다름
< 작음
>
<= 작거나 같음
>= 크거나 같음

논리 연산자 # 다시보기

연산자
&& 논리곱
|| 논리합
! 부정

비트 연산

비트 연산자는 데이터 통신이나 이진 파일을 처리할 때 자주 사용한다.

비트 연산

비트 연산이란 2진수 숫자의 자리별 값(비트 값)을 다루는 연산이다. 비트 연산자레는 비트 논리 연산자와 비트 시프트 연산자가 있다.

비트 논리 연산자

비트 논리 연산자는 비트 값이 0이면 false, 비트 값이 1이면 true로 평가하는 연산자이다.

연산자
& 비트 논리곱(AND)
| 비트 논리합(OR)
^ 비트 배타적 논리합(XOR)
~ 비트 논리 부정(NOT)

비트 시프트 연산자

비트 시프트 연산자는 정수를 2진수 비트 단위로 오른쪽 또는 왼쪽으로 이동시키는 연산자이다.

연산자
<< 왼쪽 시프트
>> 오른쪽 시프트
>>> 부호 없는 오른쪽 시프트

비트 연산의 대입 연산자

산술 연산자와 마찬가지로 비트 연산의 대입 연산자를 사용할 수 있다. 연산자로는 &=, |=, ^=, <<=, >>=, >>>=이 있다.

기타 연산 # 다시 보기

이 절에서는 typeof 연산자, 조건 연산자(?:), 쉼표 연산자(,), eval함수를 설명한다.

명시적 타입 변환 # 다시 보기

댓글남기기