데이터 타입

서동혁·2021년 12월 13일
0

Javascript

목록 보기
18/19

데이터 타입에는 크게 두 가지로 나누어져 있다.

나누는 기준?

기본형은 할당이나 연산시 복제되고 참조형은 참조된다고 할려짐
둘 모두 복제를 하기 하지만 기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담신 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다르다.


데이터의 특징

불변값(기본형 데이터)

var a = 'abc'
a = a + 'def'

위에 것으로 예를들면 변수 a에 'abc'를 할당했다가
'def'를 추가하면 기존 abc뒤에 def가 붙는게아니라
새로운 문자열 abcdef를 만들어 그 주소에 a를 저장하는것이므로, abc와 abcdef는 완전 별개의 데이터가 된다.

가변값(참조형)

기본적으로 가변값인 경우가 많지만 케바케로 변경불가로도 사용할 수 도 있다.

obj1은 객체로 참조 타입이다.
프로퍼티의 길이만큼 프로퍼티 변수 메모리 할당 영역의 정보가 저장되어있다(5001)
만약 프로퍼티의 값을 변경하려고 하면 obj1의 참조 주소 5001의 값은 불변하지만 객체 변수의 a프로퍼티 값이나 b의 값은 변경시 데이터 주소가 변경되어 가변값이라고 부른다.


변수 선언과 데이터 할당

변수 선언

변수란 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇이다
이 공간에 숫자, 문자열 등 다양한 명령을 내릴 수 있다.

컴퓨터 메모리에서 비어있는 공간을 확보하고 그 공간의 이름(식별자)를 v라고 지정했다.
이후에 사용자가 v에 접근하고자 하면 컴퓨터는 메모리에서 v 이름을 가진 주소를 검색해 해당 공간의 데이터 반환한다.

데이터 할당


변수 선언에서 101001 공간을 확보하고
그 공간에 식별자를 v로 지정하였다.
데이터 영역의 빈 공간 901001에 1을 넣었고
변수 선언에서 값을 @901001로 하였기 때문에 데이터 타입에 901001의 주소를 101001에 대입하였다.

왜 직접대입을 안 했을까?

데이터 변환을 자유롭게 할 수 있고, 메모리를 더욱 효율적으로 관리하기 위함이다.

불변객체

값으로 전달받은 객체를 변경 하더라도 원본 객체가 변하지 않아야 하는 경우에 불변 객체가 필요합니다.

객체에 직접 속한 프로퍼티에 대해서는 복사해서 완전히 새로운 데이터가 만들어진다

const obj = {
a:1,
};
const newObj = obj;

newObj.a =2;

console.log(obj.a); //2
console.log(obj === newObj); // true

1. Object.assign()

var o1 = {name:'kim'}
var o2 = Object.assign({},o1);
o2.name ='lee';
console.log(o1,o2, o1 === o2);

Object.assign(생성할 객체, 복사할 객체)로
o2 변수에 o1 객체를 복사한 후
name을 lee로 변경하면
o1은 kim, o2는 lee가 나온다.

문제점
프로퍼티만 복사한다.
2차원의 객체의 경우 깊은 복사가 이루어지지 않는다.

2. concat

var o1 = {name:'kim',score:[1,2]}
var o2 = Object.assign({},o1);
o2.score.push(3)

위처럼 바로 푸쉬를 하면 원본을 바꿔버리기 때문에 기존에 있던 o1에 영향을 주어 [1,2,3]이 되어 버린다
원본의 영향을 주지 않기위해 concat을 쓴다
concat은 원본을 복제하고 인자로 들어오는 값을 넣는데 인자를 안 넣어서 복제만 된 것이다.

var o1 = {name:'kim',score:[1,2]}
var o2 = Object.assign({},o1);
o2.score = o2.score.concat()
o2.score.push(3)


이렇게 되어 원본을 안 건드려 불변을 유지 할 수 있다.

Object freeze

객체의 프로퍼티를 얼리는 것이다.

var o1 = {name:'kim', score:[1,2]}
Object.freeze(o1);
o1.name = 'lee';
console.log(o1); // name이 그대로 kim으로 유지된다.

var o1 = {name:'kim', score:[1,2]}
Object.freeze(o1);
o1.score.push(3);
console.log(o1); // score:[1,2,3]이 된다
// 스코어는 다른 곳에 저장되어 프로퍼티에는 그 레퍼런스만 있기때문이다

스코어도 freeze하려면
Object.freeze(o1.score);
//해주면 된다

const와 freeze 차이

const는 이름이 가르키는 값을 다른 것으로 못 바꾸게하는 것이고,
freeze는 값 자체를 규제하는 것이다.
이 두 가지를 동시에 쓰면 강력하게 규제할 수 있다.

const o1 = {name:'kim'}
const o2 = {name:'lee'}
o1 = o2 //  o1과 o2가 가르키는 대상이되는 값을 못바꾸게 하려고 const를 걸어놔서 에러가 생김, 둘 중 하나가 var이면 에러가 안생김

0개의 댓글