Call By Value와 Call By Reference의 차이, 그리고 자바가 왜 항상 Call By Value인지 코드로 정리했습니다.
개념 차이
- Call By Value: 함수(메서드)에 인자를 넘길 때 값을 복사해서 전달. 함수 안에서 그 값을 바꿔도 원본은 영향받지 않음
- Call By Reference: 함수에 인자를 넘길 때 원본 변수 자체(주소)를 전달. 함수 안에서 값을 바꾸면 원본도 같이 바뀜
기본형(primitive) 예시 - 원본이 안 바뀜
java
public static void change(int x) {
x = 100;
}
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a); // 10 (그대로)
}
a의 값 10이 복사되어 x에 전달됩니다. x를 100으로 바꿔도 복사본만 바뀔 뿐, 원본 a는 그대로입니다.
객체(object) 예시 - 헷갈리기 쉬운 부분
java
class Person {
String name;
}
public static void change(Person p) {
p.name = "변경됨";
}
public static void main(String[] args) {
Person person = new Person();
person.name = "원래이름";
change(person);
System.out.println(person.name); // "변경됨" - 바뀜!
}
이걸 보고 "객체는 Call By Reference구나"라고 오해하기 쉽습니다. 하지만 정확히는, 객체의 주소값(참조)이 복사되어 전달된 것입니다. p와 person은 같은 객체를 가리키는 서로 다른 변수이기 때문에, p.name을 바꾸면 같은 객체를 가리키는 person.name도 바뀐 것처럼 보이는 겁니다.
진짜 Call By Reference였다면?
java
public static void reassign(Person p) {
p = new Person(); // p가 아예 다른 객체를 가리키게 함
p.name = "새 객체";
}
public static void main(String[] args) {
Person person = new Person();
person.name = "원래이름";
reassign(person);
System.out.println(person.name); // "원래이름" - 안 바뀜
}
만약 진짜 Call By Reference였다면 p를 다른 객체로 바꿔치기했을 때 person도 같이 바뀌어야 합니다. 하지만 결과는 person이 그대로입니다. 이는 p가 person의 "주소값을 복사한 별개의 변수"이기 때문에, p를 다른 객체로 재할당해도 원본 person은 영향받지 않는다는 걸 보여줍니다.
자바는 항상 Call By Value
자바는 기본형이든 객체든 항상 Call By Value입니다. 다만 객체를 넘길 때는 "객체 자체"가 아니라 "객체를 가리키는 주소값(참조)"이 값으로 복사되어 전달되는 것뿐입니다. 그래서 복사된 주소를 통해 원본 객체의 필드는 바꿀 수 있지만(p.name = ...), 변수 자체를 다른 객체로 바꿔치기하는 건(p = new Person()) 원본에 영향을 주지 못합니다.
'DEV > cs' 카테고리의 다른 글
| [CS] Axios 사용법 정리 - 설치부터 인터셉터까지 (0) | 2026.09.22 |
|---|---|
| [CS] 스택(Stack)이란 - 구조와 활용 예시 (0) | 2026.09.21 |
| [CS] TCP vs UDP 비교 (0) | 2026.09.18 |
| [CS] 데드락(Deadlock)이란 - 발생 조건과 해결 방법 (0) | 2026.09.17 |
| [CS] JAVA 가비지 컬렉션(GC)이란 (0) | 2026.09.16 |