본문 바로가기

프로그래밍 세상/자바스크립트 이야기

제 3장. 데이터 타입과 값


데이터 타입
프로그램 언어로 표현할 수 있고 조작할 수 있는 값의 종류

1. 숫자
자바스크립트는 모든 숫자는 실수로 표현된다.
숫자를 IEEE754표준에 의해 정의되는 64비트 실수 형식을 사용하여 표현한다.
범위 : ±1.7976931348623157 X 10^308 ~ ±5 X 10^-324

자바스크립트 프로그램 내에 바로 나타날 때 이를 숫자 리터럴 이라고 한다.

1.1 정수 리터럴
10 진수 정수는 숫자 시퀀스(=연속된 숫자나 문자를 의미) 형태로 작성된다.
0
3
1000000
범위 : -9007199254740992(-2^53)에서 9007199254740992(2^53)

1.2 16진수와 8진수
자바스크립트는 16진수 값을 인식한다.
'0x' 나 '0X'로 시작한다.
16진수 숫자 : 0 ~ 9까지는 동일하며, a(또는 A): 10, b: 11, c: 12, c: 13, d:14, e: 15, f: 16 으로 표현된다.
Oxff // 15*16 + 15 = 255(10진수 변환)

8진수 숫자 : 0 ~ 7까지 숫자로만 이루어져 있다.
0377 // 3*64 + 7*8 + 7 = 255(10진수 변환)

자바스크립트 구현에 따라서 8진수 리터럴을 지원할 수도 안할 수도 있다.
0으로 시작하는 리터럴을 8진수 값으로 인식할지 10진수 값으로 인식할지 모른다.
그러므로 0으로 시작하는 정수 리터럴은 절대로 사용하지 말라.

1.3 부동소수점 리터럴
부동소수점 리터럴은 소수점을 가질 수 있으며, 전통적인 문법으로 표현된다.
실수 : 정수부분 + 소수점, 소수점 이하 부분
지수표기법 : 실수에 이어 문자 e(혹은 E)가 따라 나오고, 그 뒤에 선택적으로 플러스 혹은 마이너스 기호가 나타나고
                  그 뒤에 선택적으로 플러스 혹은 마이너스 기호가 나타나고 마지막으로 정수 지수 값이 따라 나온다.
[digits][.digits][(E|e)[(+|-)]digits]
3.14
2345.89
.333333333
6.02e23 // 6.02 X 10^23

1.4 숫자 조작
+ - ×÷ 사칙연산 이외에도 Math라는 단일 객체의 프로퍼티를 이용해서 연산이 가능하다.
var sine_of_x = Math.sin(x);
var hypot = Math.sqrt(x*x + y*y);

1.5 숫자 변환
숫자 → 문자, 문자 → 숫자 로 변환할 수 있다.

1.6 특수한 숫자 값
부동수수점 값으로 표현가능한 가장 큰 유한 수보다 더 큰 값은 무한대를 나타내는 Infinity로 표현한다.
양의 무한대 : Infinity
음의 무한대 : - Infinity
NaN : Not a Number ( 23/0 처럼 수리 연산이 정의되지 않은 결과 )
관련 함수
isNaN : Is Not a Number - 숫자를 판별하는 함수
isFinite() : 양,음 무한대 여부를 검사

2. 문자열
Unicode 문자, 숫자, 문장부호들의 시퀀스로 텍스트를 표현한다.

3.1 문자열 리터럴
0개 또는 하나 이상의 Unicode 문자들이 작은 따옴표 혹은 큰따옴표(' 혹은 ")로 둘러싸인 시퀀스다.
한 줄을 넘지 말아야 한다.
줄바꿈을 포함하고 싶다면 \n을 사용하라.
문자열 내에 cant's, O'Reilly's 같은 영어 축약형을 표현하기 위해서는 '을 \(역슬래쉬)를 사용해서 표현해야 한다.

3.2 문자열 리터럴 내 이스케이프 시퀀스
역슬래쉬(\)는 작은 따옴표 문자를 일반적인 해석 방식에서 벗어나 특수한 방식으로 해석하게 만든다.
\' : '(작은따옴표) 문자를 문자열 내에 표현할 수 있도록 한다.
\u03c0 : 문자 파이(π) 를 타나낸다.

3.3 문자열 조작
"" + "", .charAt, substring, indexOf, .length 등으로 문자열을 조작, 정보 조회를 할 수 있다.

3.4 숫자를 문자열로 변환하기
var s = 100 + " chomae"; // 숫자 + 문자
var s = 100.toString(); // 숫자 뒤에 .toString() 메서드를 이용하면 문자열로 변환할 수 있다.

var n = 123456.789;
n.toFixed(0); // "1234567"
n.toFixed(2); // "123456.79"
n.toExponential(1); // "1.2e+5"
n.toPrecision(4); // "1.235e+5"

3.5 문자열을 숫자로 변환하기
var product = "21" * "2"; // 두 문자열 곱은 숫자 42가 된다.
var number = Number(string_value); // Number 생성자를 통해 변환한다.
parseInt(), parseFloat()를 통해 변환할 수 있다.

3.6 불리언 값
true, false 리터럴로 표현된다.
if (a==4) b=b+1;
else a=a+1;

3.7 불리언 타입 변환
1(true), 0(false)
"true"(true), "false"(false)
0, NaN(false) 그외 true

4. 함수
자바스크립트 프로그램에 정의되어 있거나 자바스크립트 구현에 미리 정의되어 있는 실행 가능한 코드
한번 정의하면 여러번 실행될 수 있다.
전달인자(argument)나 매개변수(parameter)를 넘겨받을 수 있으며, 게산 결과를 타나내는 값을 반환할 수 있다.
자바스크립트에는 여러 많은 함수가 미리 정의 되어 있다.
- Math.sin(), String.substring() ...

4.1 함수 리터럴
function 키워드, 함수 이름(생략할수 있다.), 괄호로 둘러싸인 함수 전달인자목록, 중괄호로 구성된다.
function square(x) { return x*x; }

람다함수 - 함수명이 없는 함수
var square = function(x) { return x*x; };

Function() 생성자를 통한 함수 생성
var square = new Function("x", "return x*x;");

5. 객체
이름 붙은 값들의 모음이다.
다른 언어의 객체 모양과 비슷하지만, 더 유연한 객체 개념을 제공한다.

5.1 객체 생성
생성자를 통한 생성방법으로 객체를 생성할 수 있다.
var o = new Object();
var o = new Date();

5.2 객체 리터럴
콜론으로 구별되는 프로퍼티 이름/값 쌍들이 다시 쉼표로 분리된 목록이다.
JSON 과 동일하다.

var point = { x:2.3, y:-1 };

5.3 객체 변환
null이 아닌 객체가 불리언 문맥에서 사용되면 true 로 변환된다.

6. 배열
객체처럼 데이터 값들의 모음이다.
0부터 시작하는 배열 인덱스가 있는 것이 특징이다.

6.1 배열 생성
Array() 생성자를 통해 생성할 수 있다.
var a = new Arrau();
a[0] = 1.2;
a[1] = "javascript";
a[2] = { x: 1, y: 3 };

6.2 배열 리터럴
대괄호를 통해 배열을 생성할 수 있다.
var a = [1.2, "javascript", {x:1, y:}];

7. null
아무런 값도 나타내지 않는 특수한 값
숫자 문맥에서 사용하면 0 로 변환
문자열 문맥에서 사용하면 "null" 로 변환

8. undefined
선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나
존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값
불리언 문맥에서 사용되면 false 변환
숫자 문맥에서 사용되면 NaN 변환
문자열 문맥에서 사용되면 "undefined" 변환

9. Date 객체
날짜와 시간을 표현하고 그 값을 조작하는데 사용할 수 있는 객체

10. 정규 표현식
텍스트 패턴을 기술하는데 사용할 수 있는 풍부하고도 강력함 문법을 제공한다.
/[0-9]/g

11. Error 객체
try ~ cath 구문에서 Error 객체를 사용한다.
EvalError, RangeError

13. 기본 데이터 타입 래퍼 객체
기본 데이터 타입 값과 동일한 값을 담고 있지만 데이터 조작을 위한 프로퍼티와 메서드도 가지고 있다.
자바스크립트는 유동적으로 한 타입의 값을 다른 타입의 갑으로 변환한다.
문자열에 대해 indexOf 함수를 사용하려고 할 경우 자동으로 String 래퍼 클래스를 생성하여 처리한다.
var s = "hello world";
var x = new String("hello world");
typeof 를 이용하면 객체인지 문자열인지 알 수 있다.

14. 객체에서 기본 타입으로 변환
대부분 객체는 Object의 기본 valueOf() 메서드를 상속받는다.
배열에서 toString() 을 사용할 경우 각 배열 원소를 문자열로 변환하고
배열 원소 사이에 쉼표를 삽입하여 이어 붙인 문자열을 결과로 반환한다.

15. 값에 의한 vs. 참조에 의한
by value : 값이 복사된다.
복사된 변수를 수정해도 원본 변수는 수정되지 않는다.

by reference : 주소가 복사된다.
복사된 변수를 수정하면 원본 변수도 동일한 값으로 수정된다.
(같은 주소를 참조하기 때문이다.)

15.1 기본 타입과 참조 타입
예제 실행

15.2 문자열 복사와 전달
문자열은 특이하게도 기본타입이다.
문자열은 set 프로퍼티가 없다. 그래서 참조타입보단 기본타입에 가깝다.
값을 복사하여, 조작이 가능할 수 있다.

15.3 문자열 비교
var s1 = "hello";
var s2 = "hell" + "o";
if ( s1 == s2 ) alert('chomae');
s1, s2 값이 동일하기 때문에 true 를 반환하며, alert 가 실행된다.

15.4 값에 의한 vs. 참조에 의한 : 요약
- 책 참조