해결된 질문
작성
·
355
0
public static void changeName(Camera camera){ camera.name ="잘못된 카메라"; }
와같은메소드를 다시 선언하셨는데요.
(참조형변수)String (참조변수)c1 = (객체생성) new (생성할 객체)Camera()
이런개념으로 이해를 하였는데요.
changeName 메소드를 선언하기전에는 c1, c2 참조변수를 통해서 Camera라는 메소드에 접근을 하여 c1.name, c2.name 이렇게 Camera 인스턴스 변수에 접근이 가능하였습니다.
근데 changeName이라는 변수에는 객체가 생성되지 않았는데 바로 camera.name 이렇게 접근하는것이 잘 이해가 가지 않습다.
changeName(Camera camera)
이부분에서 Camera(?) camera(참조변수))
앞부분의 Camera가 이해가 되지않습니다.
Camera메소드를 부르는건지 메소드라면 Camera() 이와같이 호출하는것은 아닌지... 정리가 잘 안됩니다. ㅜㅜ
답변 1
1
안녕하세요?
아래 코드를 한 번 볼까요?
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() 메소드에서 새로운 객체를 생성하지 않는다는 것, 다만 메소드를 호출할때 전달하는 참조 변수가 가리키는 곳을 새로운 참조 변수가 함께 가리키도록 한다는 것을 기억해주시면 되겠습니다. 😊
감사합니다.