인프런 커뮤니티 질문&답변

잘열심히님의 프로필 이미지
잘열심히

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

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

해결된 질문

작성

·

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

잘열심히님의 프로필 이미지
잘열심히

작성한 질문수

질문하기