목차
흔한 변수에 대한 오해
const name = '홍길동'
위의 코드를 보면 우리는 name
이라는 변수에 홍길동
이라는 데이터가 들어갈 것이라고 생각한다.
하지만 디테일하게 말하면 틀린 말이다.
변수의 두 얼굴
변수의 의미는 변할 수 있는 수
이다. 여기서 말하는 수
는 데이터
를 뜻한다.
const name = '홍길동'
위의 코드에서 name
은 큰 의미에서 변수
이지만, 디데일하게 얘기하면 식별자
, 변수명
이다.
사실 우리가 흔히 말하는 변수(name
)는 하나의 공간
을 뜻한다. 그 공간에 이름을 붙여준 것이 식별자
, 변수명
인 것이다.
여기서 말하는 하나의 공간
은 메모리
를 뜻한다. 모든 수(데이터)
는 메모리
에 올라간다. 그 메모리 주소를 이름으로 매핑
한 것이 식별자
, 변수명
인 것이다.
메모리 공간의 이름, 변수명
const name = '홍길동'
위의 코드에서 name
은 1001이라는 주소(임의의 메모리 주소)에 할당된다. 1001의 데이터는 변수명(식별자)인 name
이 들어가고 값으로 5001이라는 데이터 할당 메모리 주소 값
이 들어간다.
메모리 주소 | 데이터 |
---|---|
1002 | 이름: name, 값: 5001 |
… | … |
5001 | ‘홍길동’ |
데이터를 복붙하여 사용
위의 내용과 표처럼 메모리 주소의 이름을 붙여준 것이 변수명이고, 값은 또 다른 메모리 주소를 갖는다.
const personA = '홍길동'
const personB = '홍길동'
만약 위와 같이 동명이인을 코드로 표현하면 우리는 흔히 홍길동
이 두번 만들어져서 대입되는 줄 안다. 하지만 그것은 틀렸다.
메모리 주소 | 데이터 |
---|---|
1002 | 이름: personA, 값: 5001 |
1003 | 이름: personB, 값: 5001 |
… | … |
5001 | ‘홍길동’ |
위의 표와 같이 값이 복사되는 것이 아닌 메모리 주소 값이 복사되는 것이여서 결국 홍길동
이라는 데이터는 하나이다.
let personA = '홍길동'
let personB = '홍길동'
personA = '이순신'
만약 위에 같이 똑같았던 두 개의 변수 중 하나의 값이 변경하면 어떻게 될까?
메모리 주소 | 데이터 |
---|---|
1002 | 이름: personA, 값: 5002 |
1003 | 이름: personB, 값: 5001 |
… | … |
5001 | ‘홍길동’ |
5002 | ‘이순신’ |
새로운 데이터 영역의 메모리에 이순신
을 만들어서 대입 후 personA
라는 이름을 가진 메모리 주소의 값에 넣어준다.
결론
const name = '홍길동'
위의 코드를 보면 우리는
name
이라는 변수에홍길동
이라는 데이터가 들어갈 것이라고 생각한다.
하지만 디테일하게 말하면 틀린 말이다.
처음 했던 말을 좀 더 정확하게 얘기하면 위의 코드는 메모리 주소의 이름을 name이라고 정하고, 그 이름의 데이터 값에 다른 메모리 주소에 '홍길동'이라는 값을 만들고 그 메모리 주소값을 대입하는 것
이 맞다.