Chapter 2

자바와 절차적/구조적 프로그래밍

  • 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장 읽고 기억할 거 세 가지:

  1. T 메모리는 스태틱/스택/힙 세 영역으로 나뉜다. 클래스 정보와 static 멤버는 스태틱, 지역 변수는 스택, 객체는 힙에 산다
  2. 메서드가 호출되면 스택 프레임이 쌓이고, 끝나면 사라진다. 지역 변수의 생사가 여기서 결정된다. 중괄호가 열리면 태어나고 닫히면 죽는다
  3. 멀티 스레드에서 스택은 독립, 스태틱/힙은 공유. 이 구조 때문에 동시성 문제가 발생한다. T 메모리를 알면 이유가 보인다