Study · JDK · STEP 6 / 8 · 실행할 때

같은 덧셈을 객체 필드에 하면, 바뀌는 곳이 힙으로 옮겨 간다

장면

Box b = a; 뒤에 a.total만 바꿨는데 b.total을 찍었더니 15가 나왔다. 왜일까?

public class Box {
    int total;

    public static void main(String[] args) {
        Box a = new Box();
        Box b = a;
        for (int i = 1; i <= 5; i++) {
            a.total += i;
        }
        System.out.println(b.total);
    }
}

아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 방금 바뀐 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다.

장면 · 객체 필드에 더하기 0 / 24

아직 객체가 없다. 칸 0(args)은 이 장면에서 쓰지 않아 화면에서 뺐다. ▶를 누르면 new가 힙에 Box를 만들고, 칸 a · b에 참조가 들어가는 과정부터 본다.

키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음

칸 a와 b에는 객체가 아니라 같은 객체를 가리키는 참조가 들어 있다. 힙의 Box는 하나뿐이라, a로 쓴 값을 b로 읽을 수 있다.

어떻게 확인했나

  • a와 b가 같은 객체(id=530)라는 것과 반복마다의 total 값은 jdb로 읽은 실제 값이다.
  • @530은 jdb가 객체를 구별하려고 붙인 번호다. JVM 안에서 참조가 쓰는 실제 값은 아니다.
  • 칸 크기는 javap 출력이다 — stack=3, locals=4. 스택 값은 명령의 뜻대로 따라가 그렸다.