참조형도 「값」을 복사한다
"메서드 안에서 객체를 바꿨는데 — 어떨 땐 원본이 바뀌고, 어떨 땐 안 바뀌고. 도대체 규칙이 뭐예요?"
메서드에 인자를 넘길 때 자바는 항상 변수의 값을 복사해서 전달합니다. 기본형이든 참조형이든 마찬가지.
단, 참조형의 「값」은 객체 자체가 아니라 「주소」라는 점이 중요합니다.
void changeNumber(int x) {
x = 999; // 복사된 값을 바꿈
}
int a = 1;
changeNumber(a);
System.out.println(a); // 1 (안 바뀜)
a 의 값(1) 이 복사되어 x 에 들어감. x 를 999 로 바꿔도 a 와는 무관.
void changeName(User u) {
u.name = "Bob"; // 같은 객체의 필드 변경
}
User user = new User("Alice");
changeName(user);
System.out.println(user.name); // Bob (바뀜!)
user 의 값(객체 주소)이 복사되어 u 에 들어감. 둘 다 같은 객체를 가리키므로 필드 변경은 보임.
void replaceUser(User u) {
u = new User("Bob"); // u 가 가리키는 곳을 다른 객체로
}
User user = new User("Alice");
replaceUser(user);
System.out.println(user.name); // Alice (안 바뀜!)
u 가 가리키는 「주소」를 바꿨을 뿐. user 는 여전히 처음 객체를 가리킴.
다음: 클래스 vs 인스턴스.