회고록 블로그

[공부 쉬어가기] Java: 변수명도 메모리 어딘가에 저장되어 있을까 본문

2. 프로그래밍 언어 공부/Java

[공부 쉬어가기] Java: 변수명도 메모리 어딘가에 저장되어 있을까

김간장 2021. 9. 1. 23:17

자바 공부를 하다보면 변수를 선언하고 값을 할당하는 것에 대해서 배운다.

 

만약 int a = 3; 이라는 코드가 있으면

메모리의 스택(stack) 영역에 변수 a의 공간인 4바이트가 만들어지고

그 곳에 3이라는 숫자가 할당되는 것까지는 이해가 됐다.

(실제로는 더 복잡하겠지만 일단 그 부분은 생략)

 

 

메모리 주소는 임의로 설정했다.

 

메모리를 보면 "0xFFA4FD00 주소에는 4바이트의 공간이 있고, 그 곳에는 숫자 3이 저장되어 있다'는 것을 이해할 수 있지만

실제 개발자가 코드를 작성할 때는 '주소'(0xFFA4FD00)로 접근하는게 아니라 변수명 'a'를 이용해서 숫자 3에 접근한다.

 

그렇다면 중간에 누군가가 '변수명 a의 값은 메모리 주소 0xFFA4FD00에 있다'라는 것을 알려줘야 할텐데..

 

그 정보가 메모리 안에 저장되어 있는 것인지, 누가 알려주는건지를 도통 이해할 수 없어서

스택오버플로우를 뒤적뒤적하며 찾아냈다.

 


 

출처 : https://stackoverflow.com/questions/14612314/how-are-variable-names-stored-in-memory-in-c

 

How are variable names stored in memory in C?

In C, let's say you have a variable called variable_name. Let's say it's located at 0xaaaaaaaa, and at that memory address, you have the integer 123. So in other words, variable_name contains 123. ...

stackoverflow.com

 

C언어 기준이긴 하지만 Java도 얼추 비슷하지 않을까.

 

부족한 영어실력으로 대충 해석해보면,

 

C 컴파일러는  symbol table(변수명과 그 변수가 메모리의 어디에 위치해 있는지에 대한 관계를 저장해 놓은 테이블)을 먼저 만든다고 한다.

그리고 컴파일 할 때, 이 테이블을 이용해서 모든 변수의 인스턴스를 구체적인 메모리 주소로 대체시킨다고 한다.

 

좀 더 정확하게는 컴파일러와 링커가 이 일을 함께 하는데,

컴파일러는 래퍼런스(reference)를 추적하고, 링커가 올바른 주소들을 넣어준다고 한다.

 

그리고 그 매핑 정보는 당연하게도 '메모리'를 사용한다고 한다.

다만 그건 컴파일러의 메모리이지, 프로그램의 런타임과는 전혀 상관없는 메모리 공간이라고 한다.


 

결론적으로 정리하자면

변수명은 개발자의 편의성을 위해 사용되는 것이고,

프로그램을 실행할 때 쓰는 스택(stack) 입장에서는 저장할 필요도 없는 정보라는 이야기 같다.

(스택은 변수명을 알고 있을 필요도 없고)

 

컴파일러와 링커가 각각 컴파일하고 링크할 때, 코드의 변수명이 있는 부분을 모두 메모리 주소로 대체해주며

그때 사용하는 것이 변수명과 주소값을 매핑해놓은 테이블인데

그 테이블은 컴파일러가 사용하는 메모리 공간(메모리 어딘가에 있음)에 있다는 의미로 해석된다.

Comments