참조형도 「값」을 복사한다 — 읽기 자료
int, double, boolean 등. 값 자체가 변수에 직접 저장.비전공자가 자바 메서드를 다루면서 가장 자주 헷갈리는 것 — 「메서드 안에서 객체를 바꿨는데 어떨 땐 원본이 바뀌고 어떨 땐 안 바뀐다」는 현상입니다.
이 규칙을 모르면 디버깅 시 「내가 분명히 값을 바꿨는데 왜 적용이 안 되지?」 같은 미스터리가 끝까지 안 풀립니다.
자바에서 메서드를 호출할 때 인자는 언제나 값이 복사되어 전달됩니다. 기본형이든 참조형이든 예외 없음.
다만 「값」의 정체가 다릅니다:
42)0xABC123)void changeNumber(int x) {
x = 999; // 복사본을 바꿈
}
int a = 1;
changeNumber(a);
System.out.println(a); // → 1 (원본은 그대로)
a 의 값(1)이 복사되어 x 에 들어갔습니다. x 를 바꿔도 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 는 여전히 처음 객체를 가리킵니다.
JVM 의 큰 그림은 안다. 그 안에서 변수가 어떻게 전달되는지는 모름.
메서드 인자가 어떻게 복사되는지 알고, 「내 변경이 원본에 적용될지 안 될지」 판단할 수 있다.