티스토리 뷰

언어 관련 도서를 보거나 블로그를 보면 불변, 가변이라는 단어가 나옵니다, 이 단어의 의미는 무엇일까요? 가변, 불변의 의미를 알기 위해서는 변수에 저장된 데이터가 어떻게 메모리에서 관리되는지 알아야 합니다. 오늘의 이야기는 JavaScript로 불변 값, 가변 값에 대해서 알아보고자 합니다.

1. 데이터 할당

1. 변수 선언과 데이터 저장 시 메모리 상태

  1. var a : 변수 a를 선언하면 메모리의 변수 영역의 임의의 주소에 할당이 됩니다.  
    - 101 번지에 변수 a가 할당됩니다.
  2. a = 'abc' : 변수 a에 값을 대입(저장) 하면 메모리의 데이터 영역을 스캔하여서 없으면 임의의 주소에 값을 할당하고 변수 a를 가리키고 있는 주소의 값으로 데이터 영역의 임의의 주소를 저장하게 됩니다.
    - 'abc' 값은 메모리의 데이터 영역을 스캔하여서 값이 저장된 곳이 없으므로 임의의 주소 502번지에 할당(저장) 되고 그 주소를 변수 a의 주소 101번지의 값[502]으로 저장합니다.
  3. var b = 'def' : 변수 a와 동일한 방법으로 메모리에서 관리됩니다.
    - 변수 b는 메모리 변수 영역[102번지]에 할당되고 값은 메모리 데이터 영역에 할당[503번지] 하고 그 주소를 변수 b의 메모리 번지[102번지]의 값[503]으로 저장합니다.

2. 동일 변수에 데이터 재 할당 시 메모리 상태

  1. 변수 a를 선언하고  변수 a에 'abc'를 저장하면 "변수 선언과 데이터 저장 시 메모리 상태"에서와 동일하게 메모리에 저장됩니다,
    - 변수 영역 101 번지 : 502
    - 데이터 영역 501 번지 : 'abc'
  2. a = 'xyz'을 재 할당 즉 데이터 변경을 하면 메모리 영역을 먼저 스캔하여 'xyz'이 없으므로 임의의 주소 501번지에 값을 할당(저장)하고 변수 a가 있는 101번지의 값으로 501로 변경합니다.
    - 변수 영역 101 번지 : 502
    - 데이터 영역 501 번지 : 'abc'
    - 501번지는 아무도 사용하지 않으므로 나중에 GC(Garbage Collection) 대상입니다.

2. 분별 값(Immutable Value)

변수는 변수 영역에 다른 데이터를 재 할당할 수 있는 것을 의미합니다. 즉 변수와 상수는 변경 가능서에 대한 것입니다. 불변하다는 것은 메모리에 있는 데이터 영역의 값이 변경되지 않는 것을 의미합니다. 기본 Data Type(Primitive Type : 문자열(String), 숫자(Number), 불린 등)을)을) 을 불변 값이라 합니다.

var a = 'abc';               
var b = 'def';
var c = 'def’;

a = a + 'xyz';       
b = 7;

  1. 변수 a, b는 각각 다음과 같이 메모리에 할당됩니다.
    - 변수 a : 변수 영역 101번지 ( 501 ), 데이터 영역 501번지 ( 'abc' )
    - 변수 b : 변수 영역 102번지 ( 502 ), 데이터 영역 502번지 ( 'def' )
  2. 변수 c에 저장된 'def'를 저장하기 전에 메모리의 데이터 영역을 스캔하여 있으면 해당 번지를 재활용하게 되고 변수 영역만 할당됩니다.
    - 변수 c : 변수 영역 103번지 ( 502 ), 데이터 영역 5012번지 ( 'def' )
  3. 변수 a의 값이 변경되면 그 결과(abcxyz)를 메모리의 데이터 영역을 스캔하여 동일한 데이터가 없으므로 신규로 메모리 할당이 되고 변수 영역 a의 메모리 주소의 값을 변경합니다. 변수 b도 동일한 과정으로 진행됩니다.
    - 변수 a : 변수 영역 101번지 ( 503 ), 데이터 영역 503번지 ( 'abcxyz' )
    - 변수 b : 변수 영역 102번지 ( 504 ), 데이터 영역 504번지 ( 'def' )
  4. 메모리의 데이터 영역의 501번지, 502번지의 값은 그대로 있습니다. 이것을 불변 값이라고 합니다. 즉 변수의 값이 변경이 되어도 변수의 데이터 영역을 신규 할당하고 변수 영역의 값만 변경되는 것입니다. 데이터 영역의 저장된 값이 어떠한 곳에서도 참조하고 있지 않으면 향후 GC(Garbage Collection)가 발생하여 사라지게 됩니다.

3. 가변 값(mutable value)

참조 데이터 타입(Reference Type)은 선언된 변수의 메모리 값은 변경이 없지만 요소의 메모리 값은 변경이 되어서 가변 값이라 합니다.

1. 변수 obj는 변수 영역의 주소에 데이터 영역의 주소를 가지고 있고, 요소 a, b는 변수 각각 변수 영역과 메모리 영역이 할당됩니다. 즉 참조형 타입을 선언한 변수와 요소가 각각 메모리에 할당 됩니다.
- 변수 obj : 변수 영역 101번지 ( 501 ) ,  데이터 영역 501번지 ( 102, 103 )
- 속성 a : 변수 영역 102 번지 ( 502 ), 데이터 영역 502 번지 ( 10 )
- 속성 b : 변수 영역 103 번지 ( 503 ), 데이터 영역 503 번지 ( '문자' )

2. 변수 Obj의 속성 a를 변경하면 속성 a에 저장하는 값을 데이터 영역을 스캔하여 없으면 신규로 메모리 할당하여 저장하고 변수 영역의 속성 a에 신규 할당된 메모리 주소로 저장합니다. 변경되는 부분은 속성의 메모리 영역만 변경이 되고  변수 Obj의 메모리 영역은 변경이 되지 않습니다. 이것을 가변 값이라 표현합니다.
- 변수 Obj : 변수 영역 101번지 ( 501 ) ,  데이터 영역 501번지 ( 102, 103 ) -> 변경 없음
- 속성 a : 변수 영역 102 번지 ( 504 ), 데이터 영역 504 번지 ( 20 ) -> 변경됨 


* 배열의 주소 참조

- 변수 arr을 변수 영역 101번지를 의미하며 요소를 각각 메모리 공간에 할당합니다.

* 중첩 객체

- 참조형과 동일한 원리로 동작하게 됩니다.

* 변수 비교

 

불변, 가변은 메모리의 상태를 의미하는 것으로 다른 언어 java, c 등 다른 언어도 비슷한 성질을 가지고 있습니다. 

 

연관 : JavaScript 자료형

'프로그램이야기' 카테고리의 다른 글

5. 람다 이야기 1  (0) 2022.06.02
4. 동작파라미터 2 (Behavior Parameterization)  (0) 2022.06.01
3. 동작 파라미터 1 - 일급객체  (0) 2022.06.01
3. Java enum  (0) 2022.05.13
1. 프로그램 배우기에 앞서  (0) 2022.03.11