본문 바로가기
웹/JavaScript

자바스크립트 변수, 상수, 불변값, 불변성

by void pattern 2022. 11. 13.

변수(variable) : 변할 수 있는 수, 변할 수 있는 무언가

식별자(identifier) : 변수의 뜻에서 '무언가'는 데이터라 함.
숫자, 문자열, 객체, 배열 모두 데이터. 식별자는 어떤 데이터를 식별하는 데 사용하는 이름, 즉 변수명

 

 

변수 선언 a는 undefined이더라도 나중에 다른 값으로 바꾸면 된다

let a;

 

데이터 할당

var a;			//변수 a선언
a = 'abc';		//변수 a에 데이터 할당

var a = 'abc';	//변수 선언과 할당을 한 문장으로 표현


불변값

변수(variable)와 상수(constant)를 구분하는 성질은 '변경 가능성'이다.

바꿀 수 있으면 변수, 바꿀 수 없으면 상수.

 

변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다.

한 번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당할 수 있는지 여부가 관건이다.

 

기본형 데이터인 숫자, 문자열, boolean, null, undefined, Symbol 모두 불변값이다.

 

데이터 불변성

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

var b = 5;
var c = 5;
b = 7;

(1-2번째줄)

변수 a문자열에 'abc'를 할당한 다음 'def'를 추가하면 'abc'가 'abcdef'로 바뀌는 것이 아님

새로운 문자열 'abcdef'를 만들고 그 주소를 변수 a에 저장

'abc'와 'abcdef'는 완전히 별개의 데이터

 

(4번째줄)

b를 숫자 5를 할당함

컴퓨터는 일단 데이터 영역에서 5를 찾고 없으면, 데이터 공간을 하나 만들어 저장한 후 그 주소를 b에 저장

 

(5번째줄)

다시 같은 수인 5를 할당하려 함

컴퓨터에서 5를 찾음

4번째줄에서 이미 만들어놓은 값이 있으니 그 주소를 재활용

 

(6번째줄)

변수 b의 값을 7로 바꾸려 함

기존에 저장된 5자체를 7로 바꾸는 것이 아니라

존에 저장했던 7을 찾아서 있으면 재활용하고, 없으면 새로 만들어 b에 저장

 

결국 5와 7 모두 다른 값으로 변경할 수 없음

문자열 값도 한 번 만든 값을 바꿀 수 없고, 숫자 값도 다른 것으로 변경할 수 없음

변경은 새로 만드는 동작을 통해서만 이뤄지는 것이 불변성(한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다)

 


가변값

var obj1 = {
	a : 1,
    b : 'bbb'
}

참조형 데이터의 할당

[변수 영역] | [데이터 영역] | [객체 @5001의 변수 영역]

  1. 변수영역 : 메모리 @1002에 변수 obj1을 값으로 메모리 @5001을 저장
  2. 데이터 영역 : 메모리 @5001데이터 그룹(프로퍼티)인 {a:1, b:'bbb'}을 저장
    을 하려 했는데 데이터 그룹이기 때문에 이 객체 프로퍼티들을 별도로 저장하기 위해
  3. 객체 @5001의 변수 영역을 하나 더 만들고 
    그 영역의 주소의 메모리 @7103에 프로퍼티 a와 값으로 @5003을 저장, 메모리 @7104에 프로퍼티 b와 값은 @5001에 저장

참조형 데이터는 기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다.

객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다.

데이터 영역에 저장된 값은 모두 불변값이고, 변수에는 다른 값을 얼마든지 대입할 수 있다.

따라서 참조형 데이터는 불변하지 않다(가변값이다)라고 한다.

참조형 데이터 영역이 변경되는 것이 아니라 객체의 변수 영역이 변경되는 것이다

 

 

값을 직접 저장할 경우

  • 데이터 할당이 빠름
  • 비교에 비용이 많이 듦
  • 메모리 낭비가 심함

값의 주소를 저장할 경우

  • 데이터 할당이 느림
  • 비교에 비용이 안 듦(메모리에 같은 값이 오직 하나만 존재함 👉🏻 불변값)
  • 메모리 낭비 최소화

 

댓글