자바 수련각
수련각은 언어와 런타임을 맡는다. 자바 문법으로 짠 것이 어떻게 기계에 닿는지 — javac가 무엇을 만들고, JVM이 그것을 어떻게 읽고, 스택과 힙에서 무슨 일이 벌어지는지가 여기 있다.
지금 이 구역에서 끝낸 수련은 하나다.
익힌 것 — java Hello 한 줄을 8단계로 따라갔다
Study · JDK는 java Hello 한 줄이 화면에 글자를 찍기까지를 여덟 토막으로 잘라, 단계마다 버튼으로 한 스텝씩 넘기며 보는 페이지다. 글로 읽고 끝나는 것이 아니라 그 자리에서 값이 움직이는 것을 본다.
값의 출처는 내 컴퓨터의 JDK 21.0.10 실측과 JDK 27 소스다. 지어낸 숫자가 없다.
| 단계 | 무엇을 보나 | 남는 것 |
|---|---|---|
| 1 · 왜 | JDK는 왜 있나 | .class 한 벌이 OS별 JVM 셋으로 퍼진다 |
| 2 · 컴파일 | .java가 .class가 되기까지 |
토큰 → 나무 → 바이트 |
| 3 · 클래스 파일 | 414바이트 안에 든 것 | 바이트를 한 구간씩 해독한다 |
| 4 · 시작 | java Hello를 친 순간 |
런처 · JVM · Java 코드 · 내 코드 사이 19스텝 |
| 5 · 스택 | 1부터 5까지 더하기 | 명령을 한 줄씩 실행하며 칸과 스택을 본다 |
| 6 · 힙 | 객체 필드에 더하기 | 같은 덧셈이라도 힙이 바뀐다 |
| 7 · GC | 살아 있는 것만 옮긴다 | 영역 격자가 비워진다 |
| 8 · JIT | 자주 도는 코드 번역 | 구간마다 빨라지는 시간 막대 |
8단계를 한 번 지나면 다음 질문에 답할 수 있다 — .class는 왜 OS를 안 타나, 지역 변수와 객체 필드는 왜 사는 곳이 다른가, GC는 무엇을 기준으로 남기나, 같은 코드가 왜 두 번째부터 빨라지나.
같이 읽는 글
Study가 런타임을 따라갔다면, 아래 글은 그 위에서 코드를 어떻게 짜는지를 다룬다.
- JVM 메모리 구조와 Spring Bean 생명주기 — 스택 · 힙 · GC가 싱글턴 빈과 어떻게 만나는지. Study 5~7단계를 실제 스프링 코드 쪽에서 다시 본다
- Null-free 객체 설계와 생성 철학 — 생성자 · 정적 팩토리 · 불변성
- 팩토리 메소드 패턴으로 Service 레이어 가독성 개선하기
- 상속 vs 합성: 실무에서 어떻게 선택할까
- Assert로 프로그래머의 실수를 잡아내기
아직 안 한 것
수련각의 나머지 자리다. 지금은 비어 있고, 공부하면서 채운다.
- 클래스로더 — Study 4단계에서 「읽어 들인다」로 지나간 자리. 부모 위임, 언로딩, 커스텀 로더
- 스레드와 메모리 모델 —
synchronized,volatile, happens-before - 컬렉션 내부 —
HashMap이 실제로 어떻게 버킷을 나누고 언제 트리로 바뀌나 - GC 알고리즘 비교 — Study 7단계는 한 가지만 본다. G1 · ZGC · Parallel을 조건별로
최상단으로 이동했습니다!