본문 바로가기
핀테크 서비스 프론트엔드 개발자 취업 완성 2기/JS

[JS] 데이터 - 데이터 불변성 (Immutability)

by flyda 2022. 4. 26.

데이터 불변성 (Immutability)

원시 데이터 : String, Number, Boolean, undefined, null

  • 불변
    참조형 데이터 : Object, Array, Function (함수도 콜백(함수의 인수)로 사용할 수 있기 때문!)
  • 가변
  • 같은 주소를 바라볼 때, 하나의 변수에서 값이 수정되도 다른 변수에서도 수정된 값이 나옴 (주의!!)

원시 데이터

let a = 1
let b = 4
console.log(a, b, a === b)//1 4 false
b = a
console.log(a, b, a === b)//1 1 true
a = 7
console.log(a, b, a === b)//7 1 false
let c = 1 // 기존의 1이 들어있는 메모리 주소를 바라보게 됨! 
console.log(b, c, b === c)//1 1 true

새로운 원시 데이터를 사용했을 때, 그 데이터가 기존의 메모리 주소에 들어 있다면 기존에 존재하던 메모리 주소를 바라보게 해줌!
원시 데이터는 불변함!! 간단하게 생긴 것이 같으면 같은 데이터라고 이해해도 무방함.


참조형 데이터

참조형 데이터의 경우 원시형 데이터와 다르게 모양이 같아도 다른 메모리 주소를 사용하고 있을 수 있음!!
참조형 데이터는 새로운 값을 만들때 마다 새로운 메모리 주소에 할당됨. 참조형 데이터는 불변성이 없다.

let a = { k: 1}
let b = { k: 1}
console.log(a, b, a === b)//{ k: 1} { k: 1} false
b = a
console.log(a, b, a === b)//{k: 1} {k: 1} true
a.k = 7
b = a
console.log(a, b, a === b)//{k: 7} {k: 7} true
a.k = 2
console.log(a, b, a === b)//{k: 2} {k: 2} true 
// 같은 메모리 주소를 참조하는 변수들이 있을 때, 하나의 변수의 값을 수정하게 되면 다른변수에서 값을 확인할 때 의도치 않게 값이 변해져 있을 수 있음. 
// 주의해서 사용해야함. 

let c = b
console.log(a, b, c, a === c)//{k: 2} {k: 2} {k: 2} true
a.k = 9
console.log(a, b, c, a === c)//{k: 9} {k: 9} {k: 9} true

같은 메모리 주소를 참조하는 변수들이 있을 때, 하나의 변수의 값을 수정하게 되면 다른변수에서 값을 확인할 때 의도치 않게 값이 변해져 있을 수 있다.
주의해서 사용해야한다.
그래서 참조형 데이터를 관리할 때, 할당연산자(=)를 사용하는 것이 의도치 않은 문제를 발생시킬 수 있기 때문에 복사를 사용해야 한다. 복사를 해야 변수 별로 따로 데이터를 관리 할 수 있다. 복사에는 얕은 복사와 깊은 복사가 있다.

참조에 의한 객체 복사

댓글