inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

참조 (Reference)

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

415

Ambition

작성한 질문수 61

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가 그림과 같이 인스턴스 변수뿐만 아니라, 인스턴스 변수가 가리키고 있는 참조값도 동시에 가리키고 있는 것이 맞을까요??

java 객체지향 참조

답변 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 이 잡고 있는 풍선을 잡을 수 있게 되는 것이죠 😊
감사합니다.

1

Ambition

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

0

zmdkrjsl

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

imageimage

0

나도코딩

👏👏👏👏👏 아주 좋아요!

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

146

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

119

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

72

1

사고력 키우는 법이 어떤게 있나요?

0

93

2

getter setter

0

103

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

80

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

76

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

115

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

167

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

117

2

응용이 어렵습니다.

0

206

2

IntelliJ가 보이지 않습니다.

0

186

3

JDK 버전 문의

0

130

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

121

2

Iterator 문의

0

105

1

코드 순서 문의

0

143

1

클래스 메소드

0

149

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

80

2