자바
이 구역은 언어와 런타임을 맡는다. 자바 문법으로 짠 것이 어떻게 기계에 닿는지 — javac가 무엇을 만들고, JVM이 그것을 어떻게 읽고, 스택과 힙에서 무슨 일이 벌어지는지가 여기 있다.
지금 이 구역에서 끝낸 공부는 하나다.
익힌 것 — java Hello 한 줄을 8단계로 따라갔다
Study · JDK는 java Hello 한 줄이 화면에 글자를 찍기까지를 여덟 토막으로 잘라, 단계마다 버튼으로 한 스텝씩 넘기며 보는 페이지다. 글로 읽고 끝나는 것이 아니라 그 자리에서 값이 움직이는 것을 본다.
값의 출처는 내 컴퓨터의 JDK 21.0.10 실측과 JDK 27 소스다. 지어낸 숫자가 없다.
- 1왜 JDK는 왜 있나 .class 한 벌이 OS별 JVM 셋으로 퍼진다
- 2컴파일 .java가 .class가 되기까지 토큰 → 나무 → 바이트
- 3.class 414바이트 안에 든 것 바이트를 한 구간씩 해독
- 4시작 java Hello를 친 순간 런처 · JVM · Java 코드 · 내 코드 사이 22스텝 — 화면에 찍히기까지
- 5스택 1부터 5까지 더하기 명령을 한 줄씩 실행하며 칸과 스택 보기
- 6힙 객체 필드에 더하기 같은 덧셈을 객체 필드에 하면 힙이 바뀐다
- 7GC 살아 있는 것만 옮긴다 영역 격자가 비워진다
- 8JIT 자주 도는 코드 번역 구간마다 빨라지는 시간 막대
8단계를 한 번 지나면 다음 질문에 답할 수 있다 — .class는 왜 OS를 안 타나, 지역 변수와 객체 필드는 왜 사는 곳이 다른가, GC는 무엇을 기준으로 남기나, 같은 코드가 왜 두 번째부터 빨라지나.
같이 읽는 글
Study가 런타임을 따라갔다면, 아래 글은 그 위에서 코드를 어떻게 짜는지를 다룬다.
[Java] JVM 메모리 구조와 Spring Bean 생명주기 완벽 이해하기
자바 코드는 컴퓨터가 바로 실행하지 않는다. JVM이라는 프로그램이 컴파일된 코드를 읽어 실행하고, 그동안 객체를 어디에 둘지, 언제 치울지도 JVM이 정한다. Spring으로 만든 서버도 결국 JVM 위에서 돈다.
스택 · 힙 · GC가 싱글턴 빈과 어떻게 만나는지. Study 5~7단계를 실제 스프링 코드 쪽에서 다시 본다
[Java] Null-free 객체 설계와 생성 철학 정리
이번 글은 “애플리케이션 내부에는 null이 없다” 라는 전제에서 출발한다. 여기서 「내부」는 객체가 한 번 만들어진 뒤의 세계다. null은 주로 바깥 — 사용자가 보낸 요청에 담겨 들어온 값, DB에서 읽은 값처럼 내가 만들지 않은 값 — 에서 들어오는데, 그 값이 객체로 만들...
생성자 · 정적 팩토리 · 불변성
[Java] 팩토리 메소드 패턴으로 Service 레이어 가독성 개선하기
비즈니스 로직이 복잡해 지면서 Service 레이어(서비스 계층과 같은 말)의 코드가 복잡해지기 시작했다. 특히 DTO를 VO로 변환할 때 문제가 두드러졌다. 해당 문제는 로직의 가독성을 크게 떨어뜨렸다. DTO를 왜 VO로 바꿔 쓰는지는 이 글이 다루지 않는다. 이 글은 「바꾸기...
[Java] 상속 vs 합성: 실무에서 어떻게 선택할까?
“상속은 나쁘다”, “합성이 항상 우월하다”는 말을 자주 듣는다. 하지만 실무에서는 이런 이분법적 사고가 오히려 비효율적일 수 있다. 이번 글에서는 상속(Inheritance)과 합성(Composition)을 실무에서 어떻게 선택하고 활용하는지, 실제 경험을 바탕으로 정리해보겠다.
[Java] Assert로 프로그래머의 실수를 잡아내기
Java의 assert는 개발자들 사이에서 “있지만 거의 쓰지 않는” 기능으로 취급받습니다. 왜일까요?
아직 안 한 것
이 구역의 나머지 자리다. 지금은 비어 있고, 공부하면서 채운다.
- 클래스로더 — Study 4단계에서 「읽어 들인다」로 지나간 자리. 부모 위임, 언로딩, 커스텀 로더
- 스레드와 메모리 모델 —
synchronized,volatile, happens-before - 컬렉션 내부 —
HashMap이 실제로 어떻게 버킷을 나누고 언제 트리로 바뀌나 - GC 알고리즘 비교 — Study 7단계는 한 가지만 본다. G1 · ZGC · Parallel을 조건별로