• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

Reference 부분에 대해 질문이있습니다.

23.01.02 14:15 작성 조회수 174

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.namec2.name 모두 같은 값이 출력되는 것입니다.
도움되셨으면 합니다 😊
감사합니다.