2021. 6. 13. 22:59ㆍ프론트엔드/JAVASCRIPT
Javascript Data Type
자바스크립트의 모든 값은 데이터 타입을 가지는데,
크게 2가지로 기본형(Primitive Type)과 참조형(Reference Type)이 있음.
Primitive Type(원시값)
- 원시값은 변경 불가능한 값으로 한번 생성된 원시 값은 읽기 전용인 값으로써 변경할 수 없음.
- 원시값은 불변성(immutability)를 가짐.
*불변성이란?
변수는 하나의 값을 저장하기 위해 확보된 메모리 공간 자체 또는 메모리 공간을 식별하기 위해 붙인 이름이고, 값은 변수에 저장된 데이터. 그래서 원시 값은 불변성을 가진다는 말은 원시 값 자체를 변경할 수 없다는 것이지, 변수 값을 변경할 수 없다는 것이 아님. 변수는 언제든지 재할당을 통해 변수 값을 변경할 수 있기에 '변할 수 있는 수'인 것.
그래서 변수에 새로운 값을 할당하면, 원시값은 변경 불가능 하기 때문에 변수가 참조하는 메모리 공간의 주소가 변경되는데, 이러한 특성을 불변성(immutability)라고 함. 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에는 변수 값을 변경할 수 있는 방법이 없으며, 만약 재할당을 하지 않고 변수 값을 변경할 수 있다면 값의 변경(즉, 상태 변경)을 추적하기 어렵게 만듬.
var age = 80;
var copy = age
console.log(age); //80
console.log(copy); //80
age = 20;
console.log(age); //20
console.log(copy); //80
age변수에 80을 할당하고, copy변수에 age변수를 할당 한 경우를 생각해보면,
age변수와 copy변수는 숫자 80을 갖는다는 점에서는 동일하지만, 변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수(copy)에는 할당되는 변수(age)의 원시 값이 복사되어 전달되는데, 이를 값에 의한 전달이라하며 age변수와 copy변수의 값 80은 서로 다른 메모리 공간에 저장된 별개의 값이기에 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없는데, 이를 불변성(immutable)한 상태를 가진다고 함.
따라서, age라는 변수에 20이라는 값을 재할당하면 copy에는 영향을 미치지 않음.
Reference Type
객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제될 수 있고 프로퍼티의 값에도 제약이 없음.
따라서 객체는 원시값과 같이 확보해야할 메모리 공간의 크기를 사전에 정할 수가 없는데, 객체는 복합적인 자료구조이므로 객체를 관리하는 방식이 원시 값과 비교해서 보다 복잡함. 그래서 구현 방식도 브라우저마다 다른 경우가 존재함.원시 값은 상대적으로 적은 메모리를 소비하지만 객체는 경우에 따라 크기가 매우 클 수도 있음. 그래서 객체를 생성하고 프로퍼티에 접근하는 것도 원시 값과 비교할 때 비용이 많이 드는 일이며, 객체는 원시값과 다른 방식으로 동작함.
객체(참조)타입은 원시값과 다르게 변경 가능한 값(mutable value).
var user = {
name: 'Jun'
}
위와 같이 선언했을 때 원시 값을 할당한 변수는 원시 값 자체를 값으로 갖게되지만, 객체를 할당한 변수는 동적으로 변할 수 있는 메모리 공간에 있는 데이터의 주소를 갖게 됨. 여기서 참조 값은 생성된 객체가 저장된 메모리 공간의 주소 그 자체라서 객체를 할당한 변수를 참조하면 메모리에 저장되어 있는 참조 값을 통해 실제 객체에 접근함.
이러한 점때문에 수정에 있어서도, 원시 값은 변경 불가능한 값이므로 원시 값을 갖는 변수의 값을 변경하려면 재할당을 통해 메모리에 원시 값을 새롭게 생성해야 하지만, 객체는 변경 가능한 값이므로 메모리에 저장된 객체를 직접 수정 할 수 있음. 이 때 객체를 할당한 변수에 재할당을 하지 않았으므로 객체를 할당한 변수의 참조 값은 변경되지 않음.
객체는 원시값처럼 크기가 일정하지도 않고 프로퍼티 값이 객체일 수도 있어서 생성하는 비용이 많이 들 수 밖에 없으며, 원시값에 비해 생성하고 관리하는 방식이 복잡하고 비용이 많이 듬. 즉 메모리의 효율적 사용이 어렵고 성능이 나빠질 수 있기 때문에 메모리의 효율적 사용을 위해 객체를 복사해 생성하는 비용을 절약하고 성능을 향상시키기 위해 객체는 변경 가능한 값으로 설계되어 있음. (메모리 사용의 효율성과 성능을 위해 어느 정도의 구조적인 단점을 감안한 설계)
이러한 구조로 인해 원시 값과는 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 있을 수 있음.
var user = {
name: 'Jun'
}
var copy = user
객체를 가리키는 변수(원본, user)를 다른 변수(사본, copy)에 할당하면 원본의 참조 값이 복사되어 전달되는데, 이를 참조에 의한 전달이라고 함. 두 개의 식별자는 하나의 객체를 공유하게 되기 때문에 원본 또는 사본 중 어느 한 쪽에서 객체를 변경하면 서로 영향을 주고 받게 됨.
결국 값에 의한 전달과 참조에 의한 전달은 식별작가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일하지만, 식별자가 기억하는 메모리 공간, 즉 변수에 저장되어 있는 값이 원시 값이냐 참조 값이냐의 차이만 있음.
'프론트엔드 > JAVASCRIPT' 카테고리의 다른 글
[JS] this (0) | 2021.06.24 |
---|---|
[JS] EVENT (0) | 2021.06.14 |
[JS] BOM(Browser Object Model) (0) | 2021.06.13 |
[JS] DOM 이란? (0) | 2021.06.06 |
[JS] Json key,value 가져오는 방법 (2) | 2020.12.22 |