고리타분한 개발자
자료형 본문
- 프로그래밍은 변수를 통해 값을 저장하고 참조하며 연산자로 값을 연산, 평가하고 조건문과 반복문에 의한 흐름제어로 데이터의 흐름을 제어하고 함수로 재사용이 가능한 구문의 집합을 만들며 객체, 배열 등으로 자료를 구조화하는 것이다.
- 변수는 위치(주소)를 기억하는 저장소이다. 위치란 메모리 상의 주소(address)를 의미한다. 즉 변수란 메모리주소(Memory address)에 접근하기 위해 사람이 이해할 수 있는 언어로 지정한 식별자(Identifier)이다.
- 변수(memory address에 접근하기 위한 식별자)를 통해 메모리에 값을 저장하기 위해서는 우선 필요한 저장 단위(byte)를 알아야한다. 이는 값의 종류에 따라 값을 지정하기 위해 확보해야할 메모리의 크기가 다르기 때문이다. 이때 값의 종류 즉 데이터의 종류를 자료형(Data Type)이라 한다.
- 예를 들어 1byte(8bit)로 표현할 수 있는 값의 총수는 256개(2^8)로 아스키코드(ASCII)를 표현할 수 있으며, 4byte(32bit)로 표현할 수 있는 값의 총수는 4,294,967,296개(2^32)로 -2,147,483,648 ~ 2,147,483,647의 정수를 표현할 수 있다.
- C나 Java같은 C-family 언어는 Static Typing(정적 타이핑)언어로 변수 선언 시 변수에 저장할 값의 종류에 따라 사전에 자료형을 지정(Type annotation)하여야 한다. 다음은 C에서 정수형 변수를 선언하는 예이다.
// 1byte 정수형: -128 ~ 127
char c;
// 4byte 정수형: -2,124,483,648 ~ 2,124,483,647
int num;
- C 언어 코드의 4byte 정수형인 int 변수 선언을 만나면 시스템은 이후 할당될 값과는 상관없이 4byte의 메모리를 할당해준다. 따라서 자료형에 맞는 값을 대입(할당) 하여야한다. 다음은 C에서 정수형 변수에 문자열을 잘못 할당한 예이다.
int main(void) {
int num = 46;
char * str = "String";
num = "String"; // warning: incompatible pointer to integer conversion assigning to 'int' from 'char [7]'
return 0;
}
- Javascript는 동적 타이핑(Dynamic Typing) 언어로 변수의 Type annotation이 필요없이 값이 할당되는 과정에서 자동으로 자료형이 결정(Type Inference)된다. 따라서 같은 변수에 여러 자료형의 값을 대입할 수 있다.
var str = 'Hello';
var num = 1;
var bool = true;
var foo = 'string';
console.log(typeof foo); // string
foo = 1;
console.log(typeof foo); // number
- Javascript에는 어떠한 자료형이 있는지 그리고 어떻게 사용하는지 알아보도록 하자.
Data Type (자료형)
- 자료형(Data Type)은 프로그래밍 언어에서 문자열, 숫자, 불리언, 객체 등 여러 종류의 데이터를 식별하는 분류를 말한다. 모든 프로그래밍 언어의 학습은 자료형을 파악하는 것으로부터 시작된다.
- 최신 ECMAScript 표준은 7개의 Data Type을 정의한다.
- 기본 자료형 (Primitive Data Type)
- Boolean
- null
- undefined
- number
- string
- symbol
- 객체형 (Object Type)
- object
- Javascript의 자료형은 크게 기본 자료형(Primitive Data Type)과 객체형(참조형)으로 구분할 수 있다.
기본자료형 (Primitive Data Type)
- 기본자료형의 값은 변경 불가능한 값(immutable value)이다. 또한 이들은 pass-by-value 이다.
Boolean
- 논리적인 요소를 나타내면 true와 false 두가지 값을 가질 수 있다. 비어있는 문자열과 null, undefined, 숫자 0은 false로 간주된다.
var foo = true;
var bar = false;
null
- null 타입은 딱 한 가지 값, null을 가질 수 있다. Javascript는 case-sensitive하므로 null은 Null, NULL등과 다르다.
- Computer science에서 null은 의도적으로 기본형(primitives) 또는 object형 변수에 값이 없다는 것을 명시한 것이다. 이는 변수와 메모리 어드레스의 참조 정보를 제거하는 것을 의미하며 자바스크립트 엔진은 참조가 없어진 메모리 영역에 대해 가비지 콜렉션을 수행할 것이다.
var foo = 'Lee';
foo = null; // 참조 정보가 제거됨
- 주의할 것은 데이터 형식을 나타내는 문자열을 반환하는 typeof 연산자로 null값을 가진 변수를 연산해 보면 null이 아닌 object가 나온다.
var foo = null;
console.log(typeof foo); // object
- 따라서, null 타입 변수인지 확인할 때 typeof 연산자를 사용하면 안되고 일치 연산자(===)를 사용하여야 한다.
var foo = null;
console.log(typeof foo === null); // false
console.log(foo === null); // true
undefined
- 값을 할당하지 않은 변수는 undefined 값을 가진다. 즉, 선언은 되었지만 할당된 적이 없는 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 반환된다.
var foo;
console.log(foo); // undefined
var bar = {
name: 'Lee',
gender: 'male'
};
console.log(bar); // { name: 'Lee', gender: 'male' }
console.log(bar.baz); // undefined
Number
- C 언어의 경우, 정수형과 실수형을 구분하여 int, long, float, double 등과 같은 다양한 숫자 자료형이 존재한다. 하지만, 자바스크립트는 하나의 숫자 자료형만 존재한다.
- ECMAScript 표준에 따르면, 숫자 자료형은 배정밀도 64비트 부동 소수점 형 단 하나만 존재한다. 정수만을 표현하기 위한 특별한 자료형(integer type)은 없다.
- 추가적으로 세가지 의미있는 기호적인 값들도 표현할 수 있다.
var x = 10; // 정수
var y = 10.12; // 실수
var z = -20; // 음의 정수
var foo = 42 / -0;
console.log(foo); // -Infinity
console.log(typeof foo); // number
var bar = 1 * 'string';
console.log(bar); // NaN
console.log(typeof bar); // number
String
- String(문자열) 타입은 텍스트 데이터를 나타내는데 사용한다. 이는 0개 또는 그 이상의 유니코드(16비트 부호없는 정수 값) 문자들의 집합이다. 문자열은 작은 따음표('') 또느 큰 따음표("")안에 텍스트를 넣어 생성한다.
var str = "string"; // double quotes
str = 'string'; // single quotes
console.log(typeof str); // string
var answer = "It's alright"; // Single quote inside double quotes
answer = "He is called 'John'"; // Single quotes inside double quotes
answer = 'He is called "John"'; // Double quotes inside single quotes
- C와 같은 언어와는 다르게, 자바스크립트의 문자열은 기본 자료형으로 변경 불가능(immutable)하다. 이것은 한 번 문자열이 생성되면, 그 문자열을 변경할 수 없다는 것을 의미한다. 아래의 코드를 살펴보자.
var str = 'Hello';
str = 'world';
- 첫번째 구문이 실행되면 문자열 'Hello'가 생성되고 식별자 str은 메모리에 생성된 문자열 'Hello'을 수정하는 것이 아니라 새로운 문자열 'world'를 메모리에 생성하고 식별자 str은 이것을 가리킨다. 이때 문자열 'Hello'와 'world'는 모두 메모리에 존재하고 있다. 변수 str은 문자열 'Hello'를 가리키고 있다가 문자열 'world'를 가리키도록 변경되었을 뿐이다.
var str = 'string';
// 문자열은 유사배열이다
console.log(str[0], str[1], str[2], str[3], str[4], str[5]);
str[0] = 'S';
console.log(str); // string
- 문자열은 배열처럼 인덱스를 통해 접근할 수 있다. 이와 같은 성질을 유사 배열 이라한다.
- str[0] = 'S'처럼 이미 생성된 문자열에 새로운 문자를 대입하여 변경시켜도 반영되지 않는다(이때 에러가 발생하지 않는다). 한번 생성된 문자열은 read only로서 수정은 불가능하다. 이것을 변경 불가능(immutable)이라 한다.
- 그러나 새로운 문자열을 할당하는 것은 물론 가능하다. 이는 기존 문자열을 수정하는 것이 아닌 새로운 문자열을 할당하는 것이기 때문이다.
var str = 'string';
console.log(str); // string
str = 'String';
console.log(str); // String
str += ' test';
console.log(str); // String test
str = str.substring(0, 3);
console.log(str); // Str
str = str.toUpperCase();
console.log(str); // STR
Symbol
- Symbol은 ES6에서 새롭게 추가된 7번째 타입이다. Symbol은 애플리케이션 전체에서 유일하며 변경 불가능한(immutable) 기본 자료형(primitive)이다. 주로 객체의 프로퍼티 키(property key)로 사용한다. Symbol 값은 애플리케이션 전체에서 유일하기 때문에 Symbol 값을 키로 갖는 프로퍼티는 다른 어떠한 프로퍼티와도 충돌하지 않는다.
var key = Symbol('key');
console.log(typeof key); // symbol
var obj = {};
obj[key] = 'value';
console.log(obj[key]); // value
객체형 (Object Type, 참조형)
- 객체는 데이터와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함할 수 있는 개념적 존재이다. 달리 말해, 이름과 값을 가지는 데이터를 의미하는 프로퍼티(property)와 동작을 의미하는 메소드(method)를 포함할 수 있는 독립적 주체이다.
- 자바스크립트는 객체(object)기반의 스크립트 언어로써 자바스크립트를 이루고 있는 거의 "모든 것"이 객체이다. 기본자료형(Primitives)을 제외한 나머지 값들(배열, 함수, 정규표현식 등)은 모두 객체이다. 또한 객체는 pass-by-reference이다.
참고자료
- http://poiemaweb.com/js-data-type-variable
'JavaScript > About JS' 카테고리의 다른 글
Hello Javascript (3) (0) | 2017.11.28 |
---|---|
Hello Javascript (2) (0) | 2017.11.28 |
Hello Javascript (1) (0) | 2017.11.28 |
자바스크립트란? (2) (0) | 2017.11.28 |
자바스크립트란? (1) (0) | 2017.11.28 |
Comments