자바와 절차적/구조적 프로그래밍
- 2.1 자바 프로그램의 개발과 구동
- 2.2 T 메모리 구조
- 2.3 메서드 스택 프레임
- 2.4 변수와 메모리
- 2.5 블록 구문과 변수의 스코프
- 2.6 멀티 스레드와 멀티 프로세스
자바 코드를 짜면서 변수가 메모리 어디에 사는지 모르면, 객체 지향은 절대 제대로 이해할 수 없어.
JVM이 프로그램을 실행하면 메모리를 세 영역으로 나눠서 쓰는데, 저자는 이걸 T 메모리라고 불러. 스태틱 영역에는 클래스 정보와 static 멤버가 올라가고, 스택 영역에는 메서드 호출마다 생기는 지역 변수가 쌓이고, 힙 영역에는 new로 만든 객체가 살아. 이 세 칸이 어떻게 굴러가는지 아는 게 2장의 전부야.
핵심은 스택 프레임이야. main()이 호출되면 스택에 main 프레임이 생기고 그 안에 지역 변수들이 잡혀. 거기서 add()를 호출하면 add 프레임이 위에 쌓이고, add()가 끝나면 그 프레임이 통째로 날아가면서 안에 있던 변수도 같이 사라져. 여는 중괄호 {를 만나면 공간이 생기고, 닫는 중괄호 }를 만나면 공간이 죽는다 — 이게 변수의 생명주기를 결정하는 원칙이야. if 블록 안에서 선언한 변수가 블록 밖에서 안 보이는 이유도, for 루프의 카운터가 루프 밖에서 접근 불가능한 이유도 전부 여기서 나와.
그리고 자바에서 메서드에 인자를 넘기면 원본이 가는 게 아니라 값을 복사해서 넘기는 거야. 외부 프레임에서 내부 프레임 변수에 접근하는 것도, 반대도 불가능해. 이게 Call by Value지. 참조 변수의 경우엔 복사되는 "값"이 주소값이라 헷갈릴 수 있는데, 어쨌든 원본 참조 자체가 넘어가는 건 아니야.
이 구조가 진짜 빛나는 건 멀티 스레드를 볼 때야. 스택은 스레드마다 독립이지만, 스태틱과 힙은 모든 스레드가 공유하거든. 지역 변수가 스레드 안전한 이유, static 변수가 동시성 문제를 일으키는 이유 — 전부 T 메모리 구조에서 답이 나와. "static 변수 쓰면 위험하다"를 외우는 게 아니라, 스태틱 영역이 공유된다는 걸 알면 왜 위험한지가 보이는 거야.
정리
2장 읽고 기억할 거 세 가지:
- T 메모리는 스태틱/스택/힙 세 영역으로 나뉜다. 클래스 정보와 static 멤버는 스태틱, 지역 변수는 스택, 객체는 힙에 산다
- 메서드가 호출되면 스택 프레임이 쌓이고, 끝나면 사라진다. 지역 변수의 생사가 여기서 결정된다. 중괄호가 열리면 태어나고 닫히면 죽는다
- 멀티 스레드에서 스택은 독립, 스태틱/힙은 공유. 이 구조 때문에 동시성 문제가 발생한다. T 메모리를 알면 이유가 보인다