• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

23.07.19 01:24 작성 조회수 170

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

답변 1

답변을 작성해보세요.

1

안녕하세요?

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

c2 = c1;

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

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

감사합니다.