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. 스택 값은 명령의 뜻대로 따라가 그렸다.