mozilla
검색 결과

    자바스크립트의 자료형

    모든 프로그래밍 언어는 내장 자료형을 가지고 있다. 이 문서에서는 자바스크립트의 내장 자료형과 사용할 수 있는 속성들에 대해 알아본다. 가능하다면 다른 언어와도 비교해보자.

    ECMAScript 표준은 다음과 같은 6개의 자료형을  정의한다.

    • Number
    • String
    • Boolean
    • Null
    • Undefined
    • Object

    다음 장에서 이 여섯개의 자료형을 사용하는 방법과 자료형을 조합하여 더 복잡한 자료형을 만드는 방법에 대해 알아보자.

    Primitive values

    오브젝트를 제외한 모든 값은 immutable 값이다. 특별하게 문자열은 immutable 값이다(C와 다르다). 이런 값을 "primitive values" 라고 일컫는다. 아래의  Strings 장에서 더 자세히 설명할 것이다.

    Booleans, null 그리고 undefined

    이 자료형에서는 true, false, null 그리고 undefined라는 4개의 상수가 있다. 이것들은 상수이므로 이것들로 다른 오브젝트를 표현할 수 없다.

    Numbers

    ECMAScript 표준에 따르면 숫자를 표현하기 위해 "double-precision 64-bit binary format IEEE 754 value" 라는 단 하나의 방법만을 사용한다. 정수만 혹은 실수만을 표현하기 위한 특별한 방법은 없다. 또한 몇 가지 의미있는 값도 표현할 수 있다. 이 값에는 +무한대, -무한대, and NaN (숫자아님)이 있다.

    자바스크립트는 몇 가지 이진 연산자도 제공한다. 이 연산자들과 비트 마스킹(bit masking) 을 사용하여 한 숫자형 안에 여러 Boolean 값을 저장할 수 있다. 하지만 이건 코드를 어렵게 만들고 가독성이 떨어진다는 점에서 좋지 않다. 차차리 자바스크립트가 제공하는 다른 기능을 이용하자(Boolean 값들로 배열을 만들거나 Boolean 값을 속성으로 가지는 오브젝트를 만들자). 내부 저장 장소가 제한되어 있거나 굉장히 적은 네트워크 전송량을 사용해야 한다는 등의 극단적인 상황에서만 사용하자. 이런 기교는 저장 공간을 최적화한다는 점에서만 사용할 만한 가치가 있다.

    Strings

    C 같은 언어와 다르게 자바스크립트의 문자열은 immutable이다. 이것은 문자열이 생성되면 그 문자열을 수정할 수 없다는걸 의미한다. 그러나 원래 문자열에서 일부가 수정된 다른 문자열을 만드는건 가능하다. 예를들어 문자열에서 부분 문자열을 추출해 내거나(String.substr()을 사용해서) 두 문자열을 합칠 때(+ 연산자 또는 String.concat()을 이용하여) 원래 문자열에서부터 다른 문자열이 생성된다.

    "문자열형"으로 표현하기

    복잡한 자료를 표현하기 위해 문자열을 사용할 수 있다. 다음과 같은 몇 가지 이점을 가진다.

    • 결합을 통해(+연산자) 쉽게 복잡한 문자열을 만들 수 있다.
    • 디버그가 쉽다(바로 출력할 수 있기 때문에).
    • 문자열은 많은 API 에서 사용하는 공통분모이고 (입력 필드, 로컬 스토리지  값, XMLHttpRequest 요청에서 responseText를 사용할 때 등) 문자열만을 사용해야할 때도 있다.

    몇 가지 규칙만 있다면 모든 자료형을 문자열로 표시할 수 있다. 그러나 이건 좋은 생각이 아니다. 예를들어 구분자만 있다면 문자열로 리스트를 표현할 수 있을 것이다(물론 자바스크립트의 배열을 사용하는게 더 적합하다). 만약 리스트의 요소중에 구분자가 있다면 리스트는 깨질 것이다. 이런 상황 때문에 몇 가지 협약이 필요해진다. 이것은 일에 적합한 도구를 사용하지 않아서 생기는 관리 부담이다.

    문자열은 텍스트 형태의 자료나 상징적인 형태의 자료를 표현할 때만 사용하자. 

    Objects

    자바스크립트에서 오브젝트는 속성들을 담고있는 가방이다. object literal syntax를 사용하여 몇 가지 속성을 초기화 시킬 수 있다. 그리고 이런 속성을 추가하거나 삭제할 수도 있다. 속성 값으로 가질 수 있는 자료형에 제한은 없기 때문에 복잡한 자료형을 표현할 수 있다. 

    "Normal" objects, and functions

    자바스크립트 오브젝트는 키와 값의 매핑이다. 키는 문자열이고 값은 다른 어떤 값도 될 수 있다. 오브젝트는 hashmaps을 표현하는데 적합하다. 표준이 아닌 __proto__  슈도 프로퍼티를 사용할 때는 주의하자. 이것을 지원하는 환경에서는 '__proto__'는 오브젝트의 프로토타입을 의미하므로 이 이름을 키로 사용할 수 없다.   속성을 사용할 수 없다. 문자열의 출처가 분명하지 않을 때(입력 필드의 입력값 등)주의가 필요하다. 이런 일이 생길 수도 있다. 이 때는  StringMap abstraction 같은 대안을 사용해보자.

    함수는 일반 오브젝트에서 호출 가능한 특성을 추가한 오브젝트이다.

    Arrays

    배열(Arrays) 는 정수키를 가지는 일련의 값들을 표현하기 위한 오브젝트이다. 배열 오브젝트에는 길이를 나타내는 'length'란 속성도 있다. 배열은 Array.prototype을 상속받으므로 배열을 다룰 때 편한 indexOf (배열에서 값 검색)와 push (새로운 값 추가) 같은 함수를 사용할 수 있다. 배열은 리스트나 집합을 표현하는데 적합하다.

    Dates

    시간을 나타내려면 Date utility를 사용하자. 최고의 선택이다.

    WeakMaps, Maps, Sets

    표준이 아니지만 ECMAScript 6에서 표준이 될 것 같다.

    이 자료형들에서는 키가 문자열 뿐만 아니라 오브젝트도 될 수 있다. Set은 오브젝트의 집합을 나타내는 반면에 WeakMaps와 Maps는 오브젝트에 값을 연관시킬 수 있다. Map과 WeakMap의 차이는 전자는 오브젝트 키를 열거할 수 있다는 것이다. 이것은 가비지 콜렉션에서 이점을 준다.

    ECMAScript 5를 이용해서 Map과 Set을 구현할 수 있을 것이다. 그러나 오브젝트는 크기 비교가 안된다는 점 때문에(예를들어 어떤 오브젝트는 다른 오브젝트보다 '작다'라고 할 수 없다) look-up에 소요되는 시간이 선형 시간이지 않을 것이다. 네이티브 구현은(WeakMaps를 포함해서) look-up 시간이 거의 로그 시간에서 상수 시간이다.

    DOM 노드에 데이터를 지정하기 위해서 직접 속성을 지정할 수도 있지만 data-* 속성을 사용할 수도 있다. 여기에는 다른 스크립트도 모두 그 속성에 접근할 수 있다는 나쁜 점이 있다. Map과 WeakMap은 오브젝트만 사용할 수 있는 개인 데이터를 쉽게 만들 수 있게 해준다.

    TypedArrays

    표준이 아니지만 ECMAScript 6에서 표준이 될 것 같다.

    더 보기

    문서 태그 및 공헌자

    Contributors to this page: jaemin_jo, teoli
    최종 변경: teoli,