◇ PART · SPRING

Call by Value

참조형도 「값」을 복사한다 — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
Tomcat
JVM (자바 메모리)
Controller
DB

이 차시의 핵심 용어

Call by Value메서드에 인자를 넘길 때 변수의 「값」을 복사해서 전달하는 방식. 자바는 모든 경우에 이 방식.
기본형 (Primitive)int, double, boolean 등. 값 자체가 변수에 직접 저장.
참조형 (Reference)객체. 변수에는 객체의 「주소」가 저장되고, 실제 객체는 힙(Heap) 메모리에.

1. 가장 흔한 오해

비전공자가 자바 메서드를 다루면서 가장 자주 헷갈리는 것 — 「메서드 안에서 객체를 바꿨는데 어떨 땐 원본이 바뀌고 어떨 땐 안 바뀐다」는 현상입니다.

왜 알아야 하나

이 규칙을 모르면 디버깅 시 「내가 분명히 값을 바꿨는데 왜 적용이 안 되지?」 같은 미스터리가 끝까지 안 풀립니다.

2. 자바는 항상 「값 복사」

규칙 — 인자는 항상 복사된다

자바에서 메서드를 호출할 때 인자는 언제나 값이 복사되어 전달됩니다. 기본형이든 참조형이든 예외 없음.

다만 「값」의 정체가 다릅니다:

3. 기본형의 경우

void changeNumber(int x) {
    x = 999;          // 복사본을 바꿈
}

int a = 1;
changeNumber(a);
System.out.println(a);  // → 1 (원본은 그대로)

a 의 값(1)이 복사되어 x 에 들어갔습니다. x 를 바꿔도 a 는 무관합니다.

4. 참조형 — 객체 필드 변경

void changeName(User u) {
    u.name = "Bob";   // 같은 객체의 필드 변경
}

User user = new User("Alice");
changeName(user);
System.out.println(user.name);  // → Bob (바뀜!)

user 의 값(객체 주소)이 복사되어 u 에 들어갔습니다. 둘 다 같은 객체를 가리키므로 필드 변경은 양쪽에서 다 보입니다.

5. 참조형 — 참조 자체 교체

void replaceUser(User u) {
    u = new User("Bob");  // u 가 가리키는 곳을 다른 객체로
}

User user = new User("Alice");
replaceUser(user);
System.out.println(user.name);  // → Alice (안 바뀜)

u 가 가리키는 주소를 다른 객체로 바꿨을 뿐. user 는 여전히 처음 객체를 가리킵니다.

6. 한 줄 정리

기억할 규칙

7. Before / After

전 차시 끝

JVM 의 큰 그림은 안다. 그 안에서 변수가 어떻게 전달되는지는 모름.

이번 차시 끝

메서드 인자가 어떻게 복사되는지 알고, 「내 변경이 원본에 적용될지 안 될지」 판단할 수 있다.