인프런 커뮤니티 질문&답변

Ambition님의 프로필 이미지
Ambition

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

참조 (Reference)

안녕하세요 강사님께서 참조를 손으로 비유적으로 표현하셔서 저도 강의 내용의 코드를 그림으로 표현해봤는데 이 내용이 맞는지 확인부탁드립니다.

작성

·

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 = "잘못된 카메라";
    }

참조 이해를 위한 그림_캡쳐본.jpg여기서 제가 궁금한 점은, 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 가 그 풍선을 잡을 수 있게 되는 겁니다.

image이렇게 되므로 c1 이 풍선을 놓쳐도 t1 (tempCam1) 이 계속해서 풍선을 잡고 있게 되고, c1 은 다시 t1 이 잡고 있는 풍선을 잡을 수 있게 되는 것이죠 😊
감사합니다.

Ambition님의 프로필 이미지
Ambition
질문자

아 그렇군요! tempCam1과 tempCam2도 풍선(인스턴스 객체변수의 참조값)에 접근할 수가 있군요
실제로 System.out.println(tempCam1.name);System.out.println(tempCam2.name); 로 콘솔을 실행시켜보니 같은 결과가 출력되는 것을 확인했습니다 감사합니다 😄

0

클래스-참조 강의에서 제가 이해한 내용을 올려봅니다. 저는 이렇게 이해했습니다. "객체에는 메모리의 주솟값이 들어있다!" 따라서 강의에서 43행~45행을 입력하면 c1과 c2는 같은 주소를 가리키고 있기 때문에 같은 값이 출력된다.

imageimage

나도코딩님의 프로필 이미지
나도코딩
지식공유자

👏👏👏👏👏 아주 좋아요!

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기