◇ PART · SPRING

Call by Value

참조형도 「값」을 복사한다

학습 목표

  • 자바의 데이터 전달 방식이 무엇인지 안다
  • 기본형과 참조형 모두 「값 복사」가 적용됨을 안다
  • 메서드에서 객체를 변경했을 때 원본이 바뀌는지 판단할 수 있다

⚠️ 가장 흔한 오해

학생들이 자주 헷갈리는 것

"메서드 안에서 객체를 바꿨는데 — 어떨 땐 원본이 바뀌고, 어떨 땐 안 바뀌고. 도대체 규칙이 뭐예요?"

🛠️ Call by Value

자바는 항상 「값」을 복사한다

메서드에 인자를 넘길 때 자바는 항상 변수의 값을 복사해서 전달합니다. 기본형이든 참조형이든 마찬가지.

단, 참조형의 「값」은 객체 자체가 아니라 「주소」라는 점이 중요합니다.

기본형 — int, double 등


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 는 여전히 처음 객체를 가리킴.

핵심 정리

  • 자바는 항상 값 복사
  • 참조형의 「값」 = 객체 주소
  • 같은 객체의 내용을 변경 → 원본에 보임
  • 변수가 가리키는 곳 자체를 변경 → 원본에 안 보임

이번 차시의 데이터 흐름

변수의 값 복사
메서드 인자
「값」의 정체가 기본형/참조형마다 다르다는 사실이 새로 등장

정리

오늘 들고 가는 것

  • 자바는 항상 Call by Value
  • 객체 필드 변경은 보이고, 참조 교체는 안 보인다
  • 이 규칙이 뒤에서 의존성 주입 이해의 기초가 됨

다음: 클래스 vs 인스턴스.