🗺️ 컴퓨터는 데이터를 어떻게 찾을까?
— 메모리 주소(Address) 완전 정복
핵심 요약: CPU가 수억 개의 메모리 칸 중 원하는 데이터를 찾으려면 "정확한 위치"가 필요하다.
그 위치를 가리키는 고유 번호가 바로 주소(Address) 다.
1️⃣ 주소란 무엇인가?
메모리(RAM)는 수많은 저장 칸(Cell)이 일렬로 늘어선 거대한 우편함 행렬과 같다.
메모리 (RAM)
┌──────┬──────┬──────┬──────┬──────┬──────┐
│ 42 │ 11 │ 255 │ 0 │ 78 │ ... │
└──────┴──────┴──────┴──────┴──────┴──────┘
0x00 0x01 0x02 0x03 0x04 ...
↑ 주소(Address)
CPU가 데이터를 읽거나 쓰려면 "몇 번 칸인가?" 를 정확히 알아야 한다.
이 식별 번호를 주소(Address) 라고 하며, 다음 두 가지 특징을 가진다.
- 고유성: 시스템 내 각 주소는 절대 중복되지 않는다.
- 바이트 단위: 현대 컴퓨터는 1바이트(8비트)마다 하나의 주소를 할당한다 (Byte-addressability).
2️⃣ 주소는 어떻게 전달될까? — 주소 버스(Address Bus)
CPU가 메모리에 접근할 때 주소는 전기 신호 형태로 주소 버스(Address Bus) 를 통해 전달된다.
주소 버스 (Address Bus)
CPU ─────────────────────────────▶ 메모리 컨트롤러 ──▶ RAM
"0x00FF 번지 데이터 줘!" ↓
해당 위치 데이터 반환
🔑 버스 폭(Width)이 곧 메모리 한계
주소 버스의 비트 수가 접근 가능한 최대 메모리 크기를 결정한다.
| 시스템 | 주소 버스 폭 | 최대 주소 수 | 최대 메모리 |
|---|---|---|---|
| 32비트 | 32 bits | 2³² = 약 43억 | 4 GB |
| 64비트 | 64 bits | 2⁶⁴ = 약 1.8 × 10¹⁹ | 사실상 무제한 |
💡 32비트 OS에서 RAM을 4GB 이상 꽂아도 인식이 안 되는 이유가 바로 이것이다.
주소 버스가 4GB 이상의 위치를 지정할 수 없기 때문이다.
3️⃣ 물리 주소 vs 논리(가상) 주소
프로그램이 직접 RAM을 건드리면 보안 문제가 생긴다.
그래서 OS는 프로그램에게 가짜 주소(논리 주소) 를 주고, 실제 주소와의 변환을 하드웨어가 처리한다.
| 구분 | 물리 주소 (Physical) | 논리/가상 주소 (Logical/Virtual) |
|---|---|---|
| 위치 | 실제 RAM 칩 위의 주소 | 프로그램이 바라보는 주소 |
| 접근 | 하드웨어(MMU)만 직접 접근 | 프로세스가 사용 |
| 특징 | 고정, 유일 | 프로세스마다 독립적으로 0부터 시작 가능 |
| 변환 | — | MMU가 실시간으로 물리 주소로 변환 |
💡 MMU(Memory Management Unit): CPU 내부에 내장된 하드웨어.
논리 주소를 물리 주소로 변환하고, 잘못된 메모리 접근을 차단하는 보안 역할도 한다.
4️⃣ Java 개발자 관점 — 참조(Reference)와 주소
Java는 C/C++처럼 직접 메모리 주소를 다루지 않는다.
하지만 참조 변수(Reference Variable) 는 내부적으로 객체의 힙(Heap) 위치를 가리키는 논리 주소 정보를 담고 있다.
Member member = new Member("홍길동");
// ↑ 참조 변수 ↑ Heap 어딘가에 생성된 객체
// member 변수 내부에는 객체의 Heap 주소가 저장됨
🔍 JVM에서 객체 주소 확인
Member member = new Member("홍길동");
// 객체의 식별값 확인 (실제 물리 주소는 아님)
System.out.println(System.identityHashCode(member)); // ex) 1829164700
System.out.println(member); // ex) com.example.Member@6d06d69c (16진수 해시)
⚠️ 이 값은 실제 물리 주소가 아니라 JVM이 객체 식별을 위해 사용하는 해시 기반 값이다.
JVM의 GC(Garbage Collector)가 객체를 이동시킬 수 있어 실제 주소는 변할 수 있다.
Java 메모리 영역과 주소의 관계
| 메모리 영역 | 저장 내용 | 주소 관리 주체 |
|---|---|---|
| Stack | 기본 타입 변수, 참조 변수(주소값) | JVM 자동 관리 |
| Heap | new로 생성된 객체 실체 | GC가 관리 |
| Method Area | 클래스 정보, static 변수 | JVM 자동 관리 |
5️⃣ 핵심 정리
| 개념 | 한 줄 요약 |
|---|---|
| 주소 | 메모리 특정 위치를 가리키는 고유 번호 |
| 주소 버스 | CPU가 주소를 메모리로 전달하는 전용 통로 |
| 물리 주소 | 실제 RAM 위의 주소, MMU만 접근 가능 |
| 논리 주소 | 프로그램이 사용하는 가상 주소, MMU가 변환 |
| Java 참조 | 힙 내 객체 위치를 가리키는 논리 주소 정보 |