원시 타입의 값(primitive type)

건둔덕 ·2022년 6월 30일
0

Javascript

목록 보기
16/28
post-thumbnail

원시 값의 불변성

원시 타입의 값은 변경할 수 없는 값을 말한다. 즉, 한번 생성된 원시 값은 읽기 전용 값으로서 변경할 수 없다는 것을 말한다.

값을 변경할 수 없다는 말을 좀 더 구체적으로 말하자면, 먼저 식별자인 변수와 값을 구분해야 한다. 변수는 하나의 값을 저장하기 위해 화보한 메모리 공간 또는 그 메모리 공간을 식별하기 위해 붙인 이름이고, 은 변수에 저장된 데이터로서 표현식이 평가되어서 생성된 결과이다. 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다.

즉, 원시 값은 변경 불가능하다는 말은 원시 값 자체를 변경할 수 없다는 것이지 변수의 값을 변경할 수 없다는 말은 아니다. 변수는 언제든지 재할당을 통해 변수 값을 변경(정확히 말하면 교체)할 수 있다.

변수의 상대 개념인 상수는 재할당이 금지된 변수이다. 상수도 값을 할당하기 위한 메모리 공간을 확보하므로 변수라고 할 수 있다. 변수와 상수의 차이점은 변수는 얼마든지 재할당이 가능하지만 상수는 단 한번만 할당이 가능하다. 따라서 상수와 변경 불가능한 값을 동일시 하는 것은 옳지않다. 상수는 재할당이 금지된 변수일 뿐이다.

원시 값은 어떤 일이 있어도 불변한다. 이러한 원시값의 특성은 데이터의 신뢰성을 보장한다.

이처럼 원시 값은 불변한다는 특징 때문에 변수에 값을 할당할 때 이전의 원시 값을 변경하는 것이 아니라 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한 후, 변수는 새롭게 재할당한 원시값을 가리키게 된다.

값의 이러한 특징을 불변성(immutability) 이라고 한다. 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수의 값을 변경할 수 있는 방법은 없다.

유사 배열 객체(array-like object)

<script>
var str = 'string';

// 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근 가능하다.
console.log(str[0]); // 's'

// 원시 값인 문자열이 객체처럼 동작한다.
console.log(str.length); // 6
</script>

유사 배열 객체란 마치 배열처럼 인덱스를 통해 프로퍼티의 값에 접근할 수 있고 length 값을 갖는 객체를 말한다. 문자열은 배열처럼 인덱스를 통해 각 문자에 접근할 수 있고 length 프로퍼티를 가지고 있기 때문에 유사 배열 객체이고 for문으로 순회할 수도 있다.

<script>
var str = 'string';

str[0] = 'S';
console.log(str) // 'string'
</script>

str[0] = 'S' 처럼 이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않는다. 문자열은 변경 불가능한 원시 타입의 값이기 때문이다.

문자열을 변경하는 것은 불가능 하지만 변수에 새로운 문자열을 재할당 하는 것은 가능하다.

값에 의한 전달

<script>
var score = 80;
var copy = score;

console.log(score); // 80
console.log(copy); // 80

score = 100;

console.log(score); // 100
console.log(copy); // 80
</script>

score 변수에 숫자 80을 할당하고 copy 변수에 score 변수를 할당했다. 그 후 score 변수에 새로운 숫자 값 100을 재할당 하게되면 copy 변수의 값은 변하지 않는다.

위의 예시의 핵심은 '변수에 변수를 할당했을 때 무엇이 어떻게 전달되는가?' 이다.

copy = score 에서 score는 변수 값 80으로 평가되므로 copy 변수에도 80이 할당될 것이다. 이때 copy 변수는 score 변수가 바라보고 있는 메모리의 값 80을 같이 바라보게 되는 것이 아니라 새로운 숫자 값 80을 생성되어 copy 변수에 할당된다.

이처럼 변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수(copy)에는 할당되는 변수(score)의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달이라 한다.

참고로 값에 의한 전달이라는 용어는 ECMAScript 사양에는 등장하지 않는다. 값에 의한 전달이라는 용어는 타 언어에서 자주 사용하는 용어이며 자바스크립트를 위한 용어는 아니기 때문에 오해의 소지가 있을 수 있다.

엄격하게 표현하면 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달되기 때문이다. 이는 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기 때문이다.

다시 말하면, 메모리 주소를 전달하는 것이고 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.

profile
건데브

0개의 댓글