
프로그래밍을 처음 배울 때 `a = 10`이라고 적으면, 우리는 단순히 "a라는 변수에 10을 넣었다"라고 이해합니다. 하지만 컴퓨터 내부, 특히 하드웨어 레벨에서는 이 한 줄의 코드를 실행하기 위해 분주한 움직임이 일어납니다. 개발자가 단순히 코드를 짜는 사람(Coder)을 넘어 원리를 이해하는 엔지니어(Engineer)가 되기 위해서는, 내가 선언한 변수가 물리적인 메모리(RAM) 어디에, 어떤 형태로 저장되는지를 이해해야 합니다. 이것이 포인터(Pointer)의 개념이자, 자바나 파이썬의 참조(Reference) 개념을 이해하는 출발점이기 때문입니다.
1. 변수(Variable)란 무엇인가?
변수는 흔히 '데이터를 담는 상자'에 비유됩니다. 하지만 컴퓨터 구조적인 관점에서 보면 조금 더 구체적인 정의가 필요합니다. 변수는 "메모리(RAM) 상의 특정 공간에 붙여진 이름표"입니다.
1-1. RAM: 거대한 호텔과 방 번호
여러분의 컴퓨터에 있는 RAM(Random Access Memory)을 거대한 호텔이라고 상상해 보세요. 이 호텔에는 수십억 개의 방이 있고, 각 방에는 고유한 '주소(Address)'가 매겨져 있습니다. 보통 `0x7ffee2...` 같은 복잡한 16진수로 표현됩니다.
우리가 `int age = 20;`이라고 코드를 작성하면 컴퓨터는 다음과 같은 일을 수행합니다. 1. RAM이라는 호텔에서 정수(int)를 담을 만한 크기(4바이트)의 빈방을 찾습니다. 2. 그 방에 `20`이라는 손님(데이터)을 투숙시킵니다. 3. 그 방의 복잡한 주소(16진수)를 우리가 기억하기 쉬운 `age`라는 이름표로 연결(Binding)해 둡니다.
2. 기본형(Primitive) vs 참조형(Reference)의 결정적 차이
이 메모리 구조를 알아야 하는 가장 큰 이유는 데이터 타입에 따라 저장 방식이 완전히 다르기 때문입니다.
2-1. 기본형 (Primitive Type)
정수(int), 실수(double), 문자(char) 등 단순한 데이터들은 변수라는 상자 안에 '값(Value)' 자체가 직접 들어갑니다. - `int a = 10;` - `int b = a;` (a의 값을 복사해서 b에 넣음) - `a = 20;` (a만 바뀌고 b는 여전히 10임)
2-2. 참조형 (Reference Type)
배열(Array), 객체(Object), 클래스 등 덩치가 큰 데이터들은 변수 상자에 직접 들어가지 못합니다. 대신 데이터는 힙(Heap)이라는 별도의 거대한 창고에 저장되고, 변수 상자에는 "데이터가 저장된 창고의 주소값(0x1234)"만 들어갑니다. - `int[] arr1 = {1, 2};` (arr1에는 배열의 주소가 들어감) - `int[] arr2 = arr1;` (주소만 복사됨. 즉, 같은 배열을 가리킴) - `arr1[0] = 99;` (arr1을 통해 데이터를 바꿨는데, 같은 주소를 보고 있는 arr2도 바뀐 것처럼 보임) 이것이 초보 개발자들이 가장 많이 겪는 '얕은 복사(Shallow Copy)' 버그의 원인입니다.
3. 메모리 영역: 스택(Stack)과 힙(Heap)
프로그램이 실행될 때 메모리는 크게 두 구역으로 나뉩니다.
- 스택(Stack): 함수 내의 지역 변수, 매개변수 등 금방 쓰고 버릴 가벼운 데이터들이 저장됩니다. 함수가 끝나면 자동으로 삭제됩니다. 정돈이 잘 되어 있어 속도가 매우 빠릅니다.
- 힙(Heap): 사용자가 동적으로 생성한 객체나 배열처럼 크기가 크고 수명이 긴 데이터가 저장됩니다. 개발자가 직접 관여하거나 가비지 컬렉터(GC)가 청소해 줄 때까지 남아있습니다. 관리가 복잡하고 스택보다 느립니다.
1. 변수는 메모리(RAM)의 특정 주소 공간에 붙인 사람이 이해하기 쉬운 이름표입니다.
2. 기본형은 값을 직접 저장하지만, 참조형은 데이터가 있는 주소(Pointer)를 저장합니다.
3. 참조형 변수를 복사할 때는 주소만 복사되므로, 원본 데이터가 공유되는 부작용에 주의해야 합니다.