[JavaScript] 데이터 타입

Rae-eun Yang·2022년 7월 13일
0

JavaScript의 타입


7가지 데이터 타입이 존재한다.

1) 숫자 (number)
2) 문자열 (string)
3) 불린값 (boolean)
4) undefined
5) null
6) 심벌 (symbol)
7) 객체 (object)


1. 숫자(number) 타입


// 모두 숫자 타입
var integer = 10;	// 정수
var double = 10.12; // 소수
var negative = -20; // 음수
var binary = 0b01000001; // 2진수
var octal = 0o101;		 // 8진수
var hex = 0x41;			 // 16진수

// 표기법만 다를 뿐 모두 같은 값임 
console.log(binary);	 // 65
console.log(octal);		 // 65
console.log(hex);		 // 65
console.log(binary === octal) // true
console.log(octal === hex) 	  // true
// 숫자 타입은 모두 실수로 처리됨
console.log(1 === 1.0);	// true
console.log(4 / 2);		// 2
console.log(3 / 2);		// 1.5
console.log(0 === -0)	// true
Object.is(0, -0)		// false
// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0);		// Infinity
console.log(10 / -0);		// -Infinity
console.log(1 * 'String');	// NaN 
// BigInt는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체
1324293794532n === BigInt(1324293794532n)	// true

2. 문자열(String) 타입


string = '문자열'; 	// 작은따옴표
string = "문자열";		// 큰따옴표
string = `문자열`;		// 백틱 (ES6)

string = '작은따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식함';
string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식함";
// 따옴표로 감싸지 않은 hello는 식별자로 인식함
var string = hello;	// ReferenceError : hello is not defined.

템플릿 리터럴

// 템플릿 리터럴을 사용하면 줄바꿈 가능, ${}로 변수 넣기 가능
// 원래는 줄바꿈 허용 X 백틱을 쓰면 줄바꿈 허용!!
var num = 123;
var template = `template
literal
num is ${num}`;

console.log(template);
// template
// literal
// num is 123

이스케이프 시퀀스

// '또는 "를 출력하고 싶을 때, \' 또는 \"와 같이 사용하면 됨
// \n \t \b 이런게 이스케이프 시퀀스

3. 불린(Boolean) 타입


var foo = true;
console.log(foo);	// true

foo = false;
console.log(foo);	// false

4. undefined 타입


// 값을 지정하지 않았을때 자동으로 undefined가 할당
var foo;
console.log(foo);	// undefined

un + defined : define(정의)되지 않음!

변수 : "선언한다" 라고 표현
함수 : "정의한다" 라고 표현


5. null 타입


// 변수에 값이 없다는 것을 명시하고 싶을땐? null 타입을 쓰자!
var foo = 'Lee';

// 함수가 유효한 값을 반환할 수 없는 경우 null을 반환하기도 한다.
// 이전에 할당되어 있던 값에 대한 참조를 제거.
// 유용해 보이지는 않음.

함수가 유효한 값을 반환할 수 없는 경우 null을 반환하기도 한다.
예를 들어, Html요소를 검색해 반환하는 document.querySelector는 조건에 부합하는 것을 반환할 수 없는 경우 error대신 null을 반환한다.

document.querySelector('.a');	// null

6. 심벌(Symbol) 타입 (ES6)


심벌(symbol) : 변경 불가능한 원시 타입, 다른 값과 절대 중복되지 않는 유일무이한 값.

Symbol('abc') === Symbol('abc')	// false
var a = Symbol('abc');
var b = Symbol('abc');
console.log(a === b);	// false
Symbol() // 개발자가 구분하기 위한 label으로써 사용된다.
// 안에 어떤 값이 들어가던 어쨌든 절대로 중복되지 않으니까..

어쨌든 충돌할 일이 없으니 Symbol()을 객체의 프로퍼티 키로 쓰면 좋다

// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key);	// symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다
obj[key] = 'value';
console.log(obj[key]); 	// value

7. 객체(Object) 타입


숫자, 문자열, 불린, undefined, null, symbol 타입을 제외한 모든 것은 객체 타입이다.

메모리 공간의 확보와 참조

// 이런게 있다고 했을때
var a = 100;
var b = 100;

// 값은 메모리에 할당
0x123 : 100

// 식별자 a와 b 위치는 따로 있지만 같은 주소 0x123을 참조함
0x111 : 식별자 a,0x123
0x112 : 식별자 b,0x123

// 만약 b의 값이 바뀐다면??
b = 111;

0x124 : 111
0x112 : 식별자 b,0x124

위처럼 100이라는 값의 메모리 주소를 참조하는 이유:
그렇지 않으면.. 크기가 매우 큰 값들이 무분별하게 메모리 공간을 차지할 수 있음!
예를 들어.....

// 이럴 경우 엄청긴 문자열 여러개가 메모리 공간에 할당되게 된다
// -> 공간 활용이 비효율적임!
var a = "엄청긴문자열"
var b = a;
var c = b;
var d = c;

정적 타입 언어 VS 동적 타입 언어


우선 JavaScript는 동적 타입 언어이다!

정적 타입 언어

C언어의 경우에는..

// c 변수에는 1바이트 정수 타입의 값(-128 ~ 127)만을 할당 가능
char c;

// num 변수에는 4바이트 정수 타입의 값(-2,147,483,648~2,147,483,647)만을 할당 가능
int num;

동적 타입 언어

하지만 JavaScript의 경우, 그렇지 않다.
변수에 할당되는 타입을 정적으로가 아니라 동적으로 바꿀 수 있도록 한다.

변수에 재할당을 할때마다 타입이 바뀐다!

var foo;
console.log(typeof foo);	// undefined

foo = 3;
console.log(typeof foo);	// number

foo = 'Hello';
console.log(typeof foo);	// string

foo = true;
console.log(typeof foo);	// boolean

foo = null;
console.log(typeof foo);	// null (object가 나오는 것은 버그)

foo = Symbol();
console.log(typeof foo);	// symbol

foo = {};	// 객체
console.log(typeof foo);	// object

foo = [];	// 배열
console.log(typeof foo);	// object

foo = function () {}; // 함수
console.log(typeof foo);	// function

JavaScript의 변수는 선언에 아닌 할당에 의해 타입이 결정된다.
재할당에 의해 변수의 타입은 언제든지 변할 수 있다
-> dynamic typing 이라고 함

자바스크립트는 동적 타입 언어이다!

변수는 type을 갖지 않고 값은 type을 갖는다.

변수에 타입이 있는 값을 할당함으로써 변수가 가지는 값의 타입이 동적으로 변경될 수 있음


profile
개발자 지망생의 벨로그

0개의 댓글