javascript types

Javascript

프로그래밍 언어에서 자료형(types) 또는 데이터 타입(data type) 이란 숫자형(정수형, 실수형), 논리값(Boolean), 문자(String) 등의 데이터를 식별하는 분류 (indentifier) 로서, 해당 자료형에 대한 가능한 값, 해당 자료형에서 수행을 마칠 수 있는 명령들, 데이터의 의미, 값의 저장하는 방식을 결정한다.

이렇듯 자료형이란 개발자가 특정 기능 또는 함수 내에서 어떤 형태의 데이터를 다룰 것이며 이를 통해 가능한 작업은 어떤 것인지 정의할 수 있는 역할을 한다. 그렇다면 Javascript의 데이터 타입(Type)에는 무엇이 있을까?

Javascript의 Data Type 분류

Javascript의 데이터 형태 분류는 기본적으로 Primitives(원시형 또는 기본형) / Reference (참조형) 으로 나뉜다.

Primitives Type (원시형 또는 기본형)

  • 단 하나의 값만 가질 수 있음

  • 변수에 할당될 때 스택 메모리 상에 고정된 크기로 저장

  • 모든 원시 값은 불변 (immutable)의 성질로 변형 불가

    • 즉, 원시값을 교체할 수는 있지만, 직접 변형할 수는 없음

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      // 문자열 메서드는 문자열을 변형하지 않음
      var bar = "baz";
      console.log(bar); // baz
      bar.toUpperCase();
      console.log(bar); // baz

      // 배열 메소드는 배열을 변형함
      var foo = [];
      console.log(foo); // []
      foo.push("plugh");
      console.log(foo); // ["plugh"]

      // 할당은 원시 값에 새로운 값을 부여 (변형이 아님)
      bar = bar.toUpperCase(); // BAZ
  • 객체가 아니면서 메서드도 가지지 않는 데이터

  • null의 경우, 겉보기엔 원시 값처럼 보이는 있지만, 사실 Object 이며, 모든 구조화된 자료형은 prototype chain 에 따라 null의 자손이다.

  • 대부분의 경우, 원시 값은 언어 구현체의 가장 저수준(low level) 에서 나타남.

  • 원시 값 자체와, 원시값을 할당한 변수를 혼동하지 않는 것이 중요!

    • 변수: 새로운 값을 다시 할당 가능
    • 원시값: 객체, 배열, 함수와 달리 변형 불가능
  • 값에 의한 전달 (pass-by-value) 방식으로 전달

Reference Type (참조형)

  • 객체는 데이터와 그 데이터에 관련한 동작(절차, 방법, 기능)을 모두 포함할 수 있는 개념적 존재
    • 즉, PropertyMethod를 포함할 수 있는 독립적 주체이자 복합적 구조의 데이터
  • 데이터가 동적 바인딩 되므로 실행중에도 그 값이 변동될 수 있으며, 선언될때 이미 크기가 정해져 있지 않음
  • JavaScript는 객체 기반의 스크립트 언어로써 JavaScript를 이루고 있는 거의 모든 것이 객체이다.
    • 원시 타입을 제외한 나머지 값들(배열, 함수, 정규표현식 등)은 모두 객체이다.
  • 참조 타입은 변수의 값이 저장된 메모리 블럭의 주소를 가지고 있고 자바스크립트 엔진이 변수가 가지고 있는 메모리 주소를 이용해서 변수의 값에 접근한다.
    • 변수에 할당이 될 때 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조만 저장
    • 변수의 값이 저장된 힙 메모리의 주소값을 저장
  • 객체함수 는 언어의 다른 기본 요소임.
    • 객체 => 값을 위한 컨테이너
    • 함수 => 어플리케이션이 수행할 수 있는 절차 (procedure)
  • 참조에 의한 전달 (pass-by-reference) 방식으로 전달

Pass by Value VS Pass by Reference

Pass by Value

먼저, Pass by Value를 살펴보면, Function은 인수로써 변수값을 직접 전달받아 호출한다. 함수 내에서 인수를 변경하는 것은 함수 밖에 있는 변수에 영향을 끼치지 않는다.

Javascript는 항상 값에 의한 전달 이므로 변수값을 변경해도 기본 요소(문자열 또는 숫자)가 변경되지 않는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function callByValue(varOne, varTwo) { 
console.log("Inside Call by Value Method");
varOne = 100;
varTwo = 200;
console.log("varOne =" + varOne +"varTwo =" +varTwo);
}

let varOne = 10;
let varTwo = 20;

console.log("Before Call by Value Method");
console.log("varOne =" + varOne +"varTwo =" +varTwo);

callByValue(varOne, varTwo)
console.log("After Call by Value Method");
console.log("varOne =" + varOne +"varTwo =" +varTwo);

output will be :
---------------
Before Call by Value Method
varOne =10 varTwo =20
Inside Call by Value Method
varOne =100 varTwo =200
After Call by Value Method
varOne =10 varTwo =20

그러나, 변수가 배열(Array)을 포함한 객체(Object)를 참조할때는 값은 객체에 대한 참조값이다.

Pass by Reference

Pass by Reference를 살펴보면, Function은 인자로써 전달받은 변수의 참조나 주소(reference/address)를 호출한다. 함수 내에서 인자를 변경하는 것은 함수 밖에 있는 인자에 영향을 끼친다. Javascript 객체와 배열은 참조에 의한 전달을 따른다.

그러나 만약 우리가 메서드에 인자로써 객체 또는 배열을 전달한다면 객체의 값을 변경할 수 있는 가능성이 생긴다.


Primitives and Reference Type 분류

가장 기본적인 분류법으로 ECMAScript 표준에는 7가지 type으로 정의한다.

  • Primitives: 5가지 타입

  • Reference: 1가지 타입, 값이 저장된 주소값을 할당


Primitive Type (원시형 데이터)

Boolean

논리적 데이터 유형으로, truefalse 리터럴 값만 가질 수 있음.

null

일반적으로 존재하지 않거나 유효하지 않은 object를 의미하며 의도적으로 비어있는 값을 나타내기 위해서도 사용할 수 있다. 그리고 Javascript에서는 대소문자를 구분하므로 Null 또는 NULL과는 다르다.

undefined

변수 선언 후 값을 할당하지 않은 혹은 주어짖 않은 인수에 자동 할당된다. 그리고 동등 연산자(==)와 일치 연산자(===)로 비교할 때 그 결과값이 다르므로 주의해야 한다.

Number

정수, 부동 소수점, 복식 또는 대수와 같은 데이터 타입이 존재하는 다른 언어들과 다르게, Javascript 에서는 숫자 데이터 타입을 64비트 부동소수점 으로 표현한다. 즉, 정수만을 표현하기 위한 특별한 자료형은 없다. 그리고 Number 타입에는 세 가지 유의미한 상징적 값들이 있는데 이는 +/-InfinityNan 이다.

Nan 은 전역 스코프 변수로써 숫자가 아님 을 의미하며, Nan을 반환하는 다섯 가지 종료로는 아래와 같다.

  • 숫자로서 읽을 수 없음 (parseInt("어쩌구"), Number(undefined))
  • 결과가 허수인 수학 계산식 (Math.sqrt(-1))
  • 피연산자가 NaN (7 ** NaN)
  • 정의할 수 없는 계산식 (0 * Infinity)
  • 문자열을 포함하면서 덧셈이 아닌 계산식 ("가" / 3)

String

Javascript에서 문자열은 페이지 인코딩 방식과 상관없이 항상 UTF-16 형식을 따르며 String 객체는 문자열 원시값을 둘러싼 wrapper 객체이다.

Symbol

ECMAScript 2015에서 추가된 Symbol은 인스턴스가 고유하고 불변의 값을 할당할때 사용하는 데이터 타입으로, Symbol 의 값은 “Symbol 값(value)” 로서 참조될 수 있다.

Javascript 런타임 환경에서 Symbol 값은 고유하고 불변의 값을 생산하기 위해 Symbol 함수가 선언하여 동적으로 생성된다.

1
2
3
4
5
6
7
// 동일한 description으로 선언된 두개의 symbol이 있다.
let Sym1 = Symbol("Sym")
let Sym2 = Symbol("Sym")

console.log(Sym1 === Sym2) // returns "false"
// 동일한 description으로 많은 symbol을 생성하더라도 서로 다르기 때문에
// Symbol은 고유한 성질을 보장한다.

Reference Type

Object에 대한 내용은 워낙 방대하므로 추후 포스팅으로 자세히 다뤄 보도록 하겠습니다.


참고