inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

참조 (Reference)

참조 내용에서 조금 헷갈리는게 있습니다.

281

최은희

작성한 질문수 10

0

c2가 c1이 되는 부분을 풀어서 정의하면

질문이 총 두가지입니다.

  1. c2와 같은건 참조값이라고 부르나요? 아니면 참조변수라고 부르나요?

  2. c2가 c1이 된다는건 c1이 참조하고있던 주소를 c2도 참조하게 된다는건가요?

 

 

 

 package nodocoding;

import camera.Camera;

public class _16_Reference {
	public static void main(String[] args) {
		
		// 참조 
		// 기본 자료형 (Primitive Data Types) : int, float, double, long, boolean, ...
		int[] i = new int[3];
		System.out.println(i[0]); //0
		
		double[] d = new double[3];
		System.out.println(d[0]); //0.0 
		
		//참조 자료형 (Non-Primitive, Reference Data Types) : String, Camera, FactoryCam. Speedcam ..
		// 참조형은 따로 값을 정의 하지 않았을 때는 null 이다 
		// 참조 자료형은 대문자로 시작한다.
		String []s = new String[3];
		System.out.println(s[0]);
		
		Camera[] c = new Camera[3];
		System.out.println(c[0] == null);
		
		
		////////////
		System.out.println("---------------");
		int a = 10;
		int b = 20;
		b = a;
		System.out.println(a); // 10
		System.out.println(b); // 10
		b = 30;
		System.out.println(a); // 10 
		System.out.println(b); // 30 
		
		
		System.out.println("---------------");
		Camera c1 = new Camera();
		Camera c2 = new Camera();
		c1.name = "카메라1";
		c2.name = "카메라2";
		System.out.println(c1.name);
		System.out.println(c2.name);
		c2 = c1;
		System.out.println(c1.name);
		System.out.println(c2.name);1
		c2.name = "고장난 카메라";
		System.out.println(c1.name);
		System.out.println(c2.name);
		
		changeName(c2);
		System.out.println(c1.name);
		System.out.println(c2.name);
		
		c2 = null; // 풍선을 놓은 꼴 
		//System.out.println(c2.name);//에러 
		c2 = new Camera();
		c2.name = "새로생긴 카메라";
		System.out.println(c2.name);
	}
	
		private static void changeName(Camera camera) {
			camera.name = "잘못된 카메라";
		}
}

java 객체지향

답변 1

1

나도코딩

안녕하세요?

c2는 자바에서 참조 변수라고 부릅니다. 이 변수는 new Camera()를 통해 생성된 Camera 클래스의 인스턴스를 참조하고 있는데요. 참조 변수는 객체를 직접 저장하는 것은 아니며 객체가 저장된 메모리 주소를 저장합니다. 이를 통해 해당 변수는 객체에 대한 참조를 가지게 되며 인스턴스 변수에 접근하거나 메소드를 호출할 수 있게 되지요.

c2 = c1;

그리고 위 코드는 말씀하신 것처럼 c1 이 참조하고 있는 객체를 c2도 참조하게 되어 결국 둘은 동일한 객체를 참조(= 같은 메모리 주소를 가리킴) 하게 됩니다. 이후에 c2를 통해 객체의 변수를 변경하거나 메소드를 호출하면 실제로는 같은 객체를 참조하므로, c1이 가리키고 있는 객체에 동일한 변경이 반영됩니다. 즉, c1과 c2는 같은 객체를 가리키는 별개의 참조 변수로 볼 수 있습니다 😊

마치 맛있는 음료가 담긴 하나의 컵(Camera 인스턴스)에 두 개의 빨대(c1, c2) 를 꽂아서 두 명의 친구가 빨아먹는 것과 같습니다. 한 친구가 많이 마시게 되면 다른 친구가 마실 음료의 양이 줄어들게 되겠지요!

감사합니다.

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

1

146

2

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

0

119

2

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

0

70

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

129

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

121

2

Iterator 문의

0

105

1

코드 순서 문의

0

142

1

클래스 메소드

0

149

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

80

2