자바 언어는 객체 자체를 직접 가리키는 것이 아님.
객체를 찾아갈 수 있는 참조값
을 들고 있는 것이기 때문에, 객체가 복사가 되는 것이 아니다
.
따라서 아래와 같은 경우에 s1에 수정을 가해도 s1의 참조값이 바뀌는 것이고,
s2는 그대로 전의 참조값을 들고 있기 때문에 s1을 따라서 바뀌지 않는다.
참고로, 자바는 문자열을 상수
로 관리하기 때문에 원본 문자열의 수정을 허용하지 않고 새로운 객체 문자열로 만들어 버린다. 따라서 아래의 경우 s1은 새로운 문자열 객체의 참조값을 가리키게 되는 것이다.
String s1 = new String("자바 쵝오!!");
String s2 = s1; // 객체 복사X, 참조값 복사
s1 = "Java The Best!!";
System.out.println(s1);
System.out.println(s2);
Output)
Java The Best!!
자바 쵝오!!
자바는 기본적으로 모든 동작 방식이 Pass By Value
이다.
조금 더 복잡한 상황으로 완벽하게 이해해보자.
public class Person {
String name;
int age;
}
위와 같은 Person
클래스를 만들었다.
멤버 변수로 name, age가 존재한다.
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "p1";
p1.age = 20;
Person p2 = p1;
p2.name = "p2";
p2.age = 21;
System.out.println(p1.name);
System.out.println(p1.age);
System.out.println(p2.name);
System.out.println(p2.age);
}
위와 같은 코드를 작성하면 output은 어떻게 될까?
답은 다음과 같다.
p2
21
p2
21
과정을 좀 더 자세히 들여다 보자.
위와 같이 모든 객체들은 참조값
을 들고 있고 내용에 수정이 가해지면 참조값이 변경되는 것
이다.
Primitive
자료형(int age와 같은) 은 직관적으로 이해가 가는데, Non-Primitive
자료형(String name과 같은) 은 참조값이 변경된다는 점을 간과하면 헷갈리기 시작하니 조심하자.