해결된 질문
작성
·
220
0
클래스의 인스턴스 변수 또한 참조형이기떄문에
기존c1.name
을 c2.name
로 덮어씌우게 되면서 참조위치의 변형에 따라 c2.name을 따라 간다는것은 이해했습니다.
camera c1= new camera();
camera c2=new camera(); //c2는 어딘가 만들어진것을 참조만 하고있는것임
c1.name="카메라1"; c2.name="카메라2";
c2=c1; //원래 기존에 다른 참조를 하고있던것 -> c2에 c1을 넣는다 뒤에
c2.name="고장난카메라";
그러면 String변수의 경우에도 참조형변수라고 알고있는데
String hel = "안녕하세요"; String helo2 = "안녕하세요2";
hel=helo2;// hel="change";
이런식으로 진행했을때 클래스 인스턴스 변수처럼 따라오지가 않는데 왜 그런건가요?
답변 1
0
안녕하세요?
작성해주신 예제에서 hel 이라는 string 변수를 만들게 되면 메모리 공간에 "안녕하세요" 라는 글자가 저장되고 그곳을 가리키게 됩니다. helo2 변수의 경우 메모리 공간에 "안녕하세요2" 라는 글자가 저장되고 그곳을 가리키게 됩니다.
이 때 다음과 같이 하게 되면 hel 변수는 helo2 변수가 가리키는 "안녕하세요2" 를 가리키게 되지요.
hel = helo2;
그런데 hel 에 새로운 문자열을 대입하게 되면 기존 "안녕하세요2" 위치의 값이 수정되는게 아니라 새로운 메모리 공간에 "change" 라는 글자가 저장되고 그곳을 가리키게 됩니다. 그래서 helo2 는 그대로 "안녕하세요2" 를, hel 은 "change" 를 각각 가리키게 되는 것입니다.
String hel = "안녕하세요";
String helo2 = "안녕하세요2";
hel = helo2;
System.out.println(hel + " / " + helo2); // 안녕하세요2 / 안녕하세요2
hel = "change";
System.out.println(hel + " / " + helo2); // change / 안녕하세요2
참고로 다음과 같이 2개의 동일한 문자열 변수를 만들게 되면 메모리 공간에는 "안녕" 이라는 글자가 한 번만 저장되고 2개의 변수가 각각 이를 가리키게 됩니다.
String s1 = "안녕";
String s2 = "안녕";
System.out.println(s1 == s2); // true
Camera 예제에서는 c1 과 c2 객체가 각각 생성된 상태에서 c2 = c1; 을 통해 c2 는 c1 이 가리키는 곳을 함께 참조하게 됩니다. 그러므로 c1.name 또는 c2.name 의 값을 바꾸게 되면 name 변수는 새로운 메모리 공간에 저장된 "고장난 카메라" 를 가리키게 되지만, c1 이나 c2 나 결국 같은 위치를 참조하게 되며 같은 객체의 name 변수이기 때문에 println 문을 통해 출력 시 c1.name 과 c2.name 모두 같은 값이 출력되는 것입니다.
도움되셨으면 합니다 😊
감사합니다.