작성
·
202
·
수정됨
0
changeName(c2);
System.out.println(c1.name);
System.out.println(c2.name);
public static void changeName(Camera camera) {
camera.name = "잘못된 카메라";
안녕하세요 참조 강의 중 앞부분은 다 이해가 갔는데 위 코드가 등장하는 순간부터 이해가 잘 가지 않아서 질문을 드립니다.
1. 우선 아랫 부분 코드가 이해가 잘 가지 않습니다. changeName 이라는 메소드의 매개변수에
(Camera camera)가 들어간 것에 대한 의미를 잘 모르겠습니다.
changeName(c2)를 통해서, c2가 참조하는 첫번째 Camera()의 이름을 바꿨는데,
Camera camera는 무슨 의미로 작성하신 건지 잘 이해가 가지 않습니다..
2.camera.name도 잘 이해가 가지 않습니다. 코드에서 camera라는 객체나 메소드가 보이지 않는데 왜 camera.name의 의미는 camera의 이름을 바꾸는 것인데, 제가 볼 땐 camera라는 메소드 또는 객체가 보이지 않는데 왜 강사님께서 이렇게 작성을 하신건지 잘 모르겠습니다..ㅠ
changeName(c2);
System.out.println(c1.name);
System.out.println(c2.name);
이렇게 봤을 때는 이해가 잘 가는데요.. ㅠㅠ
답변 1
0
※ 본 질문은 아래 링크의 질문과 유사하여 동일한 답변을 제공합니다.
https://www.inflearn.com/questions/769968
안녕하세요?
답변이 늦어 죄송합니다.
아래 코드를 한 번 볼까요?
Camera c1 = new Camera();
c1.name = "새 카메라";
Camera c2 = c1;
Camera c3 = c1;
먼저 c1 이라는 새로운 Camera 객체를 만들었습니다. 그런 다음에 c1.name 에는 "새 카메라" 라는 값을 넣었지요. 이후에 c2, c3 를 만들고 여기에 각각 c1 을 대입하였습니다. 그러면 다음과 같이 출력하게 되면 결과가 어떻게 나올까요?
System.out.println(c1.name);
System.out.println(c2.name);
System.out.println(c3.name);
실행 결과는 이렇습니다.
새 카메라
새 카메라
새 카메라
네, c1, c2, c3 의 name 이 모두 "새 카메라" 라고 나오죠. 이게 무슨 의미냐면, 코드 첫 줄에서 new Camera() 동작을 하게 되면 어딘가 새로운 객체를 만들게 되며 이 객체를 c1 이라는 참조 변수가 참조하게 됩니다. 화살표로 가리킨다고 표현을 써볼게요. c1 은 new Camera() 를 가리키고 있고 c1 에서 뻗어나오는 화살표를 따라가면 new Camera() 를 통해 만들어진 객체를 만날 수 있습니다.
그리고 c2, c3 라는 참조 변수를 만들고 각각 c1 을 대입합니다. 이때 동작은 c1 이 참조하고 있는, 즉 가리키고 있는 new Camera() 객체를 c2 와 c3 도 동일하게 가리키게 됩니다. 즉 메모리 공간에 new Camera() 를 통해 만들어진 객체가 있는데 이를 c1, c2, c3 가 모두 동일하게 가리키고 있는게 되는거에요. 이것이 바로 참조입니다.
changeName() 메소드에는 전달값으로 Camera 를 받고 있는데요.
public static void changeName(Camera camera) {
camera.name = "잘못된 카메라";
}
메소드는 원래 정의만 되어 있을 뿐, 어디에선가 호출하기 전까지는 아무 동작을 하지 않습니다. 그리고 전달값에 입력한 Camera camera 는 새로운 객체를 만드는 것이 아니에요. 이 메소드를 다음과 같이 호출할 때
changeName(c2);
c2 라는 참조 변수가 가리키고 있는 new Camera() 를 메소드에 정의된 camera 라는 참조 변수도 가리킬 수 있도록 하는 겁니다. 앞에서 c1 이 가리키는 객체를 c2, c3 가 함께 가리킬 수 있듯이 말이죠. 그래서 camera 라는 참조 변수를 통해 name 을 바꾸게 되면 결국 c2 참조 변수가 가리키는 객체의 name 을 바꾸는 것과 동일한 결과를 얻게 되는 것입니다.
이렇듯 참조 변수를 전달하게 되면 changeName() 메소드에서 새로운 객체를 생성하지 않는다는 것, 다만 메소드를 호출할때 전달하는 참조 변수가 가리키는 곳을 새로운 참조 변수가 함께 가리키도록 한다는 것을 기억해주시면 되겠습니다. 😊
감사합니다.