JavaScript
데이터 타입 59p~
데이터 타입
- 값의 종류를 말하며 모든 값은 데이터 타입을 갖는다.
- 7개의 데이터 타입이 있고 원시 타입과 객체 타입으로 나눈다.
- 기본형이 아닌 모든 것은 참조형이다.
구분 | 데이터 타입 | 설명 |
---|---|---|
숫자 타입 | 숫자,정수와 실수 구분 없이 하나의 숫자 타입만 존재 | |
문자열 타입 | 문자열 | |
불리언 타입 | 논리적 참과 거짓 | |
undefined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 | |
null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
심벌 타입 | ES6에서 추가된 7번째 타입 | |
객체 타입 | 객체, 함수, 배열 등 |
6.1 숫자 타입
- 정수, 실수 등 모두 숫자 타입이다.
Infinity
,-Infinity
,NaN
라는 세 가지 특별한 값도 있다.Infinity
,-Infinity
: 양과 음의 무한대NaN
: 산술 연산 불가
1
2
3
4
5
6
7
8
9
10
var a = 10;
var b = 10.23;
var c = -20;
var d = 0b01000001; // 2진수 = 65
var e = 0o101; // 8진수 = 65
var f = 0x41; // 16진수 = 65
var g = 10 / 0; // Infinity
var h = 20 / -0; // -Infinity
var i = 1 * "String"; // NaN
6.2 문자열 타입
- 작은따옴표, 큰따옴표, 백틱으로 텍스트를 감싼다.
- 백틱으로 감싸서 변수를 넣을 수 있다.
Hi${여기에는 변수}
- 따옴표로 감싸지 않은 문자열은 식별자로 인식한다.
- 문자열로 감싸지 않은 경우 공백 문자를 포함시킬 수 없다.
- 문자열은 원시 타입으로 값의 변경이 불가능하다.
- 백틱을 사용하면 줄바꿈도 가능하다.
\n
6.3 템플릿 리터럴
- 문자열 표기법을 말하며, 편리한 문자열 처리 기능을 제공한다.
이스케이프 | 의미 |
---|---|
\0 | Null |
\b | 백스페이스 |
\f | 프린터로 출력할 경우 다음 페이지의 시작 지점으로 이동한다. |
\n | 다음 행으로 이동한다. |
\r | 커서를 처음으로 이동한다. |
\t | 탭(수평) |
\v | 탭(수직) |
\uXXXX | 유니코드에 따라 이모지를 출력한다. |
' | 작은따옴표 |
" | 큰따옴표 |
예시
1
2
3
4
5
6
7
8
9
10
11
var template = `<ul>\n\t<li><a href="#">Home</a></li>\n</ul>`;
var template2 = `<ul>
<li><a href="#">Home</a></li>
</ul>`;
//출력은 모두
<ul>
<li>
<a href="#">Home</a>
</li>
</ul>;
6.3.2 표현식 삽입
- 문자열 연산자
+
를 사용할 수 있다. - 문자열인 경우 연결 연산자로 동작하고, 그 외의 경우는 덧셈 연산자로 동작한다.
1
2
3
4
5
6
7
8
9
var first = "choi";
var last = "chee";
"My name is " +
first +
" " +
last +
"."// My name is choi chee.
`My name is ${first} ${last}.`;
// My name is choi chee.
6.4 불리언 타입
true
와false
값
6.5 undefined 타입
undefined
가 유일하다.
6.6 null 타입
null
이 유일하다.null
,Null
,NULL
은 전부 다르다.
6.7 심벌 타입
- 변경 불가능한 원시 타입의 값이다.
다른 값과 중복되지 않는 유일무이한 값이며, 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
1 2 3 4 5 6
var key = Symbol("key"); typeof key; // symbol var obj = {}; obj[key] = "value"; obj[key]; // value
6.8 객체 타입
- 자바스크립트의 데이터 타입은 크게 원시 타입과 객체 타입으로 분류한다.
- 원시 타입과 객체 타입은 근본적으로 다르며, 자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체이다.
6.9 데이터 타입의 필요성
6.9.1 데이터 타입에 의한 메모리 공간의 확보와 참조
- 변수를 선언하고 값을 할당하면, 메모리 공간에 들어갈 값의 크기를 먼저 확보한다.
- 자바스크립트 엔진은 데이터 타입(값의 종류)에 따라 정해진 크기의 메모리 공간을 확보한다.
- 값을 참조하는 경우에도 한 번에 읽어 들여야 할 메모리 공간의 크기, 메모리 셀의 개수(바이트 수)를 알아야한다.
- 값의 타입이 바이트로 저장되며, 바이트 단위로 메모리 공간에 저장된 값을 읽어 들인다.
6.9.2 데이터 타입에 의한 값의 해석
- 메모리 공간의 주소에서 읽어 들인 2진수를 해석하는 과정을 거치며, 이러한 과정이 필요하기 때문에 데이터 타입의 구분이 있어야 한다.
- 메모리 공간의 크기를 결정하기 위해
- 참조를 위한 메모리 공간의 크기를 결정하기 위해
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
6.10 동적 타이핑
6.10.1 동적 타입 언어와 정적 타입 언어
- 정적 타입 언어
- C나 자바 같은 언어는 정적 타입 언어이며, 정적 타입 언어란 변수의 타입을 변경할 수 없고 변수에 선언한 타입에 맞는 값만 할당할 수 있다.
- 정적 타입 언어는 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.
- 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막는다.
- 이를 통해 타입의 일관성을 강제하여 안정적인 코드를 구현하고, 런타임에 발생하는 에러를 줄인다.
- 동적 타입 언어
- 자바스크립트는 변수를 선언할 때 타입을 선언하지 않는다.
- 미리 선언한 데이터 타입의 값뿐만 아니라 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
- 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정되며, 재할당에 의해 변수의 타입은 언제든지 변할 수 있다.
6.10.2 동적 타입 언어와 변수
- 개발자의 의도는 숫자 타입의 변수를 작성하고 싶었지만, 사실은 문자열 타입으로 작성했을 수 있다.
- 잘못된 예측에 의해 작성된 프로그램은 당연히 오류를 출력할 것이고, 동적 타입 언어는 유연성은 높지만 신뢰성이 낮다.
- 따라서, 변수를 선언할 때 주의해야 하며,변수는 재할당, 전역 변수 등의 여러 특이점을 갖고 있기 때문에 코드 작성 시 유의하여 가독성이 좋은 코드를 작성해야 한다.
연산자 74p~
7 연산자
- 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행하여 하나의 값을 만드는 것을 말한다.
1
2
3
4
5
6
5 + 4; // 산술연산자
"Hello" + "World"; // 문자열 연결 연산자
coloe = "red"; // 할당 연산자
3 > 5; // 비교 연산자
true && true; // 논리 연산자
typeof "Hi"; // 타입 연산자
7.1 산술 연산자
- 수학적 계산을 이용해 새로운 숫자 값을 만든다.
- 연산이 불가능할 경우,
NaN
을 반환한다.
7.1.1 이항 산술 연산자
이항 산술 연산자 | 의미 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
7.1.2 단항 산술 연산자
단항 산술 연산자 | 의미 | 부수효과 |
---|---|---|
++ | 증가 | O |
– | 감소 | O |
+ | 어떠한 효과도 없다. 음수를 양수로 반전하지도 않는다. | X |
- | 양수를 음수로, 음수를 양수로 반전한 값을 반환한다. | X |
1
2
3
var x = 1;
x++ === (x = x + 1); // 두 의미는 동일하다.
x-- === (x = x - 1); // 두 의미는 동일하다.
- 연산자는 위치에 의미가 있다.
1
2
3
4
5
6
var x = 5,
result;
result = x++; // 선할당 후증가, x=6, result=5
result = ++x; // 선증가 후할당, x=7, result=7
result = x--; // 선할당 후감소, x=6, result=7
result = --x; // 선감소 후할당, x=5, result=5
- 단항 연산자는 피연산자에 어떠한 효과도 없다.
1
2
+10; // 10
+-10; // -10
- 숫자 타입이 아닌 피연산자에 단항 연산자를 사용하면 피연산자를 숫자 타입으로 반환한다.
피연산자를 변경하는 것은 아니고 숫자 타입으로 변환한 값을 생성하여 반환하기 때문에, 부수효과는 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var x = "1"; +x; // 1 x; // '1' x = true; +x; // 1 x; // true x = false; +x; // 0 x; // false x = "hello" + x; // NaN x; // "hello"
-
단항 연산자를 사용하면 피연산자의 부호를 반전한 값으로 반환한다.- 마찬가지로 부수효과는 없다.
1
2
3
4
-(-10); // 10
-"10"; // -10
-true; // -1
-"hello"; // NaN
7.1.3 문자열 연결 연산자
+
연산자는 피연산자 중 하나 이상이 문자일 경우 문자열 연결 연산자로 동작한다.- 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되기도 한다는 것이다.
- 이를 암묵적 타입 변환, 타입 강제 변환이라고 한다.
1
2
3
4
5
6
"1" + 2; // "12"
1 + true; // 2
1 + false; // 0
1 + null; // 1
+undefined; // NaN
1 + undefined; // NaN
7.2 할당 연산자
할당 연산자 | 예 | 동일 표현 | 부수 효과 |
---|---|---|---|
= | x = 5 | x = 5 | O |
+= | x += 5 | x = x + 5 | O |
-= | x -= 5 | x = x - 5 | O |
*= | x *= 5 | x = x * 5 | O |
/= | x /= 5 | x = x / 5 | O |
%= | x %= 5 | x = x % 5 | O |
7.3 비교 연산자
7.3.1 동등/일치 비교 연산자
- 동등 비교 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다.
- 동등 비교 연산자는 결과를 예측하기 어렵기 때문에, 잘 쓰이지 않는다.
- 주로 일치,불일치 비교 연산자를 사용한다.
- 일치, 불일치 비교 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같아야 한다.
바교 연산자 | 의미 | 사례 | 설명 | 부수 효과 |
---|---|---|---|---|
== | 동등 비교 | x == y | x와 y의 값이 같음 | X |
=== | 일치 비교 | x === y | x와 y의 값과 타입이 같음 | X |
!= | 부동등 비교 | x != y | x와 y의 값이 다름 | X |
!== | 불일치 비교 | x !== y | x와 y의 값과 타입이 다름 | X |
주의 사항
NaN
은 자신과 일치하지 않는 유일한 값이다.- 숫자가
NaN
인지 조사하려면Number.isNaN
을 사용한다. - 양의 0과 음의 0을 비교하면
true
를 반환한다. NaN
과 0을 비교하기 위해서는Object.is
메사드를 사용해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13
NaN === NaN; // false Number.isNaN(NaN); // true Number.isNaN(10); // false Number.isNaN(1 + undefined); // true 0 === -0; // true 0 == -0; // true NaN === NaN; // false Object.is(NaN, NaN); // true 0 === -0; // true Object.is(0, -0); // false
7.3.2 대소 관계 비교 연산자
true
나false
값을 반환한다.
대소 관계 비교 연산자 | 예제 | 설명 | 부수효과 |
---|---|---|---|
> | x > y | x가 y보다 크다. | X |
< | x < y | x가 y보다 작다. | X |
>= | x >= y | x가 y보다 크거나 같다. | X |
<= | x <= y | x가 y보다 작거나 같다. | X |
7,4 삼항 조건 연산자
- 조건식의 결과에 따라 반환할 값을 결정한다.
조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값
1
2
3
4
5
6
7
8
x ? 5 : null;
// x에 값이 있을 떄는 5를 반환하고, 값이 없을 때는 null을 반환한다.
x + 5 === 10 ? '100점' : '0점';
// x + 5가 10일 때, 100점이라는 문자를 반환하고, false일 때는 0점을 반환한다.
var x = if(...){...} else{...};
// if와 다른 점은 if문은 값처럼 사용할 수 없다.
var x = x + 100 >= 100 ? 1 : 0;
x; // x는 1 혹은 0을 리턴한다.
7.5 논리 연산자
논리 연산자 | 의미 | 부수효과 | ||
---|---|---|---|---|
` | ` | 논리합(OR) | X | |
&& | 논리곱(AND) | X | ||
! | 부정(NOT) | X |
7.6 쉼표 연산자
- 왼쪽 피연산자부터 차례대로 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환한다.
1
2
var x, y, z;
(x = 1), (y = 2), (z = 3); // 3
7.7 그룹 연산자
- 소괄호로 피연산자를 감싸 우선순위를 조절한다.
1
2
10 * 2 + 3; // 23
10 * (2 + 3); // 50
7.8 typeof 연산자
- 피연산자의 ㄷ이터 타입을 문자열로 반환한다.
7가지 문자열 중 하나를 반환하는데, 7개의 데이터 타입이 항상 정확히 일치하지는 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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 new Date() // "object" typeof /test/gi // "object" typeof function() // "function" var foo = null; typeof foo === null; // false foo === null; // true
7.9 지수 연산자
- 좌항의 피연산자를 밑 으로, 우항의 피연산자를 지수로 거듭 제곱하여 숫자 값을 반환한다.
1
2
3
2 ** 2; // 4
2 ** 0; // 1
2 ** -2; // 0.25
- 지수 연산자가 도입되기 이전에는
Math.pow
메서드를 사용했다.
1
2
3
Math.pow(2, 2); // 4
Math.pow(2, 0); // 1
Math.pow(2, -2); // 0.25
- 지수 연산자는 다음과 같은 상황에서
Math.pow
보다 가독성이 좋다.
1
2
2 ** (3 ** 2); // 512
Math.pow(2, Math.pow(3, 2)); // 512
- 음수를 거듭제곱의 밑으로 사용하려는 경우 괄호로 묶어야 한다.
1
2
3
-5 ** 2;
// SyntaxError : ...
(-5) ** 2; // 25
- 할당 연산자와 함께 사용할 수 있으며, 이항 연산자 중에서 우선순위가 가장 높다.
1
2
3
var num = 2;
num ** 2; // 4
num * 5 ** 2; // 50
7.10 그외의 연산자
연산자 | 개요 | 참고 |
---|---|---|
?. | 옵셔널 체이닝 연산자 | 9.4.2절 “옵셔널 체이닝 연산자” |
?? | null 병합 연산자 | 9.4.3절 “null 병합 연산자” |
delete | 프로퍼티 삭제 | 10.8절 “프로퍼티 삭제” |
new | 생성자 함수를 호출할 때 사용하여 인스턴스를 생성 | 17.2.6절 “new 연산자” |
instanceof | 좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별 | 19.10절 “instanceof 연산자” |
in | 프로퍼티 존재 확인 | 19.13.1절 “in 연산자” |
7.11 연산자의 부수 효과
대부분의 연산자는 다른 코드에 영향을 주지 않지만
할당 연산자
,증가/감소 연산자
,delete
연산자는 부수 효과가 있다.1 2 3 4 5 6 7
var x; x = 1; x++; // x = 2 로 재할당 var o = { a: 1 }; delete o.a; // o = {} 프로퍼티 자체를 삭제
7.12 연산자 우선순위
- 여러 개의 연산자가 실행될 때 우선순위가 다르다.
우선순위 | 연산자 | ||
---|---|---|---|
1 | () | ||
2 | new (매개변수 존재), ..[] (프로퍼티 접근), () (함수호출), ?. (옵셔널 체이닝 연산자) | ||
3 | new (매개변수 미존재) | ||
4 | x++ , x-- | ||
5 | !x , +x , -x , ++x , --x , typeof , delete | ||
6 | ** (이상 연산자 중에서 우선순위가 가장 높다.) | ||
7 | * , / , % | ||
8 | + , - | ||
9 | < , <= , > , >= , in , instanceof | ||
10 | == , != , === , !== | ||
11 | ?? (null 병합 연산자) | ||
12 | && | ||
13 | ` | ` | |
14 | ?.. : .. | ||
15 | 할당 연산자 | ||
16 | , |
7.13 연산자 결합 순서
결합 순서 | 연산자 |
---|---|
좌항 => 우항 | x ,- ,/ ,% ,< ,<= ,> ,>= ,in ,instanceof |
우항 => 좌항 | ++ ,-- ,할당 연산자,!x ,+x ,-x ,++x ,--x ,typeof ,delete ,? .. : .. ,** |