Data type

sangminnn·2020년 4월 19일
0

글로 정리하는 JS

목록 보기
5/5

Type?

오늘 주제인 Javascript의 Data type에 대해 알아보기 전에

Type이란 무엇이고, 이를 왜 나누어서 사용하는 것인지에 대해 간단히 알아보자.

먼저 위의 내용에 접근하기에 앞서 poiemaweb에서는 '프로그래밍' 의 정의로부터 설명을 시작한다.

프로그래밍은 변수를 통해 값을 저장하고 참조하며 연산자로 값을 연산, 평가하고 조건문과 반복문에 의한 흐름제어로 데이터의 흐름을 제어하고 함수로 재사용이 가능한 구문의 집합을 만들며 객체, 배열 등으로 자료를 구조화하는 것이다.

여기서 주목해야 할 부분은 프로그래밍은 변수를 통해 ~~~ 한다는 점이다.

그렇다면 변수 란 무엇일까 ?

변수는 값의 위치(주소)를 기억하는 저장소이다.

여기서의 값의 위치 란 메모리 상에서의 위치로, 메모리 상에서 값이 위치하고있는 주소를 기억하는 저장소라는 말이다.

이에 따라서 생각할 수 있는 것이 당연하게도

메모리에 값을 저장하기 위해서는 먼저 해당 값을 위해 확보해야 할 메모리의 크기를 알아야한다.

또한 그의 연장선으로 해당 값의 데이터의 종류에 따라 확보해야 할 메모리의 크기가 달라진다는 점이 중요한 포인트이다.

따라서 프로그래밍에서는 Type이 중요한 것이다.

Javascript 에서의 Type

Javascript의 언어적 특징 중 한가지로 Javascript는 동적 타입 언어라는 점을 떠올릴 수 있다.

이와 같은 점이 Javascript의 특징인것을 보면 당연히도 다른 언어들은 정적 타입 언어 라는 것이다.

그렇다면 정적 타입 언어동적 타입 언어의 차이는 무엇일까 ?

정적 타입 언어 는 변수에 값을 선언해주는 과정에서 어떤 값이 들어올 것인지에 대한 type 선언을 해주는 것이고

동적 타입 언어 는 변수에 값을 선언해주는 과정에서 type 선언을 따로 해주지 않고, 값이 할당되는 과정에서 자동으로 변수의 type이 결정되는 언어이다.

자, 이제 Javascript의 Type에는 어떤 것이 있는지 알아보자.

Javascript의 Type

Javascript의 데이터 타입은 크게 두 부류로 나눌 수 있다.

원시 타입(Primitive type)객체 타입(Object type) 이 존재한다.

1. 원시 타입(Primitive Type)

Javascript의 원시 타입은 6가지로 나누어진다.

Boolean, String, Number, Undefined, Null, Symbol(ES6)

원시 타입의 특징으로는 변경 불가능(Immutable)값에 의한 전달(pass-by-value) 이 있다.

변경 불가능(Immutable)

변경 불가능 특성은 간단하게는

Immutability(변경불가성)는 객체가 생성된 이후 그 상태를 변경할 수 없는 디자인 패턴

이라고 할 수 있다.

이는 예시 코드를 보면서 이해해보겠다.


// String
let str = "string";
str[0] = "S";

console.log(str); // string ( 변화 X )

// Object
let obj = { a: 1, b: 2 };
obj.a = 5

console.log(obj); // { a: 5, b: 2 };

위의 코드를 보면 알 수 있듯이

원시 타입인 String의 값을 변경하려고 한다면, 이 값은 변경되지 않고

객체 타입인 Object의 값을 변경하려고 한다면, 그 값은 그대로 적용이 된다는 점이다.

이렇게 한번 선언된 값을 변경하려고 할 때, 값이 변경되지 않는 특성을 변경 불가능(Immutable) 이라 한다.

++) 혹시 str에 다른 값을 넣어주는 것은 값을 변경하는 것은 가능하다고 생각할 수 있는데

그러한 경우는 해당 값을 변경하는 것이 아니라, 새로운 값으로 변수가 가리키는 주소를 이동시키는 것이다.

let str = "string"; // str은 string이라는 값의 주소를 가리킨다.
str = "hello"; // str이 가리키는 주소가 hello 로 변경

console.log(str); // hello

값에 의한 전달(pass-by-value)

값에 의한 전달(pass-by-value)은 말 그대로 값을 전달할 때,

참조 하는 것이 아니라 값을 복사 하여 전달한다는 것이다.

아래의 코드를 예시로 보자.

let a = 10;
let b = a;

console.log(a, b); // 10 10
console.log(a === b); // true

a = 7;
console.log(a, b); // 7 10
console.log(a === b); // false

위의 코드결과로 다시한번 알 수 있겠지만, 변수 a를 선언 및 a에 10을 할당, 변수 b를 선언 및 a를 할당해주고

a와 b의 값을 비교했을 때에는 당연하게도 true가 나온다.

이후 a값을 7로 변경해주고, 둘의 값을 비교했을 때 만약 참조에 의한 값의 전달이였다면,

a의 변화에 따라 b의 주소가 변경되어 두 값이 동일한 값을 가지게 된다.

하지만 원시타입의 값에 의한 전달 특성에 따라

b에는 a가 가지고 있던 10 값 자체가 할당 되었던 것이고, a의 주소값이 변경되는 것과 관련이 없기 때문에

둘이 다른 값을 가질 수 있게 된 것이다.

추가적으로 원시 타입 중 가장 중요하다고 생각하는 타입은 Number 이기 때문에 Number 타입만 따로 짚어보고 가겠다.

Number

Javascript의 Number 타입은 다른 언어와는 다른 점이 있다.

그것은 바로 타 언어들의 Number 타입과는 다르게 정수(Int), 실수(Float) 에 대한 타입이 나누어져있지 않고

Number라는 단일 Type만이 존재한다는 것이다.

이는 Javascript의 Number는 기본적으로 실수로 계산하기 때문에, 단일 타입으로 구성되어 있는 것이다.

console.log(1 === 1.0); // true

2. 객체 타입(Object Type)

먼저 객체란, 데이터와 그 데이터에 관련된 동작을 모두 포함할 수 있는 존재이다.

간단히 말해, 이름과 값을 가지는 데이터를 의미하는 프로퍼티(property)와

동작을 의미하는 메소드(method)를 포함할 수 있는 존재를 말한다.

이제 객체 타입에 대해 말해보자면

Javascript에서 원시 타입을 제외한 나머지 값들은 모두 객체 타입이라고 보면 된다.

이 객체 타입의 특징으로는 참조에 의한 전달(pass-by-reference) 가 있다.

참조에 의한 전달(pass-by-reference)

이 역시도 위에서 설명했지만 코드로 보면서 넘어가겠다.

let a = {
  val: 10
};
let b = a;

console.log(a.val, b.val); // 10 10
console.log(a === b); // true

b.val = 7;
console.log(a.val, b.val); // 7 7
console.log(a === b); // true

위의 예시와 다르게 a 변수를 선언 및 val 값을 가진 객체를 할당해주고, b 변수 선언 및 a 값을 할당해주었다.

이 순간 변수 b는 a가 가리키는 객체의 주소를 동일하게 가리키게된다.

따라서 이후 b.val를 7로 변경해준다면 a와 b가 동일하게 가리키는 { val: 10 } 객체의 val 값이 7로 변경되고

이에 따라 a와 b가 가리키는 객체는 동일하기 때문에, 둘의 val값은 동일, 둘도 동일하게 나타난다.

마치며 ...

오늘 글도 poiemaweb의

https://poiemaweb.com/js-object#4-pass-by-reference

를 보면서 공부한 내용을 정리한 글입니다.

profile
생각하며 코딩하려고 노력하는 개발자가 되겠습니다.

0개의 댓글