작성
·
327
·
수정됨
0
Camera c1 = new Camera(); // c1은 첫번째 풍선을 잡고 있음
Camera c2 = new Camera(); // c2는 두번째 풍선을 잡고 있음
Camera tempCam1 = c1; // c1의 손을 잡아달라고 요청
Camera tempCam2 = c2; // c2의 손을 잡아달라고 요청
c2 = c1;
...
changeName(c2);
System.out.println(c1.name);
System.out.println(c2.name);
c1 = null;
c2 = null;
// c1, c2가 풍선을 놓침!!
System.out.println("----------------");
c1 = tempCam1; // c1은 tempCam1의 손을 잡음
c2 = tempCam2; // c2는 tempCam2의 손을 잡음
// changeName(c2)에 의해 c1이 잡고 있는 풍선의 이름만 "잘못된 카메라"로 변경
//(=>null로 인해 가리키는 관계는 끊겼지만, 참조값이 변경된 메모리는 여전히 남아있다는 소리)
System.out.println(c1.name); // 잘못된 카메라
System.out.println(c2.name); // 카메라2
public static void changeName(Camera camera){ // c2의 인자가 파라미터에 들어가서
camera.name = "잘못된 카메라"; // c2.name = "잘못된 카메라";
}
여기서 제가 궁금한 점은, Camera tempCam1 = c1; Camera tempCam2 = c2;
부분에서 temCam1과 temCam2가 그림과 같이 인스턴스 변수뿐만 아니라, 인스턴스 변수가 가리키고 있는 참조값도 동시에 가리키고 있는 것이 맞을까요??
답변 2
1
안녕하세요?
작성해주신 코드 중에서 변경이 필요한 부분만 아래처럼 수정해보았습니다.
주석을 위주로 봐주시면 되는데요.
Camera tempCam1 = c1; // c1이 잡고 있는 풍선을 함께 잡아달라고 요청
Camera tempCam2 = c2; // c2가 잡고 있는 풍선을 함께 잡아달라고 요청
...
c1 = null;
c2 = null;
// c1, c2가 풍선을 놓침 (하지만 tempCam1 과 tempCam2 가 각각 풍선을 잡고 있음)
System.out.println("----------------");
c1 = tempCam1; // c1은 tempCam1이 잡고 있는 풍선을 다시 잡음
c2 = tempCam2; // c2는 tempCam2이 잡고 있는 풍선을 다시 잡음
그림 그려주신 부분에서 '손'을 잡는 게 아니라 다른 사람이 원래 잡고 있는 '풍선'을 함께 잡는 것으로 이해하시면 되겠습니다. 풍선을 잡고 있는 사람의 손이 아니라, 그 손이 잡고 있는 풍선을 함께 잡는 거예요. 그래서 c1 과 c2 가 풍선을 놓쳐도 (= null 처리) tempCam1 과 tempCam2 는 모두 풍선을 잡고 있었기 때문에 뒤에서 다시 c1 과 c2 가 그 풍선을 잡을 수 있게 되는 겁니다.
이렇게 되므로 c1 이 풍선을 놓쳐도 t1 (tempCam1) 이 계속해서 풍선을 잡고 있게 되고, c1 은 다시 t1 이 잡고 있는 풍선을 잡을 수 있게 되는 것이죠 😊
감사합니다.
아 그렇군요! tempCam1과 tempCam2도 풍선(인스턴스 객체변수의 참조값)에 접근할 수가 있군요
실제로
System.out.println(tempCam1.name);
와System.out.println(tempCam2.name);
로 콘솔을 실행시켜보니 같은 결과가 출력되는 것을 확인했습니다 감사합니다 😄