IT
Call by value?? Call by reference?? 알아보자
hoonylab
2025. 4. 9. 17:38
728x90
반응형
📌 Call by Value vs Call by Reference
프로그래밍 언어에서 함수나 메서드에 인자를 전달할 때, 그 방식은 크게 두 가지로 나뉩니다.
✅ Call by Value (값에 의한 호출)
- 값 자체를 복사해서 전달
- 함수 내부에서 매개변수의 값을 변경해도, 원본 값에는 영향이 없음

public class Example {
public static void changeValue(int x) {
x = 100;
}
public static void main(String[] args) {
int num = 50;
changeValue(num);
System.out.println(num); // 👉 출력: 50
}
}
설명: num
은 50
이라는 값을 가지고 있고, changeValue(num)
호출 시 50
이라는 값이 복사되어 전달됩니다. 따라서 x
를 100으로 바꿔도, num
에는 영향이 없습니다.
✅ Call by Reference (참조에 의한 호출)
- 참조(주소)를 전달
- 함수 내부에서 매개변수로 전달된 객체를 변경하면, 원본 객체도 변경됨

class Person {
String name;
Person(String name) {
this.name = name;
}
}
public class Example {
public static void changeName(Person p) {
p.name = "Chris";
}
public static void main(String[] args) {
Person person = new Person("Alex");
changeName(person);
System.out.println(person.name); // 👉 출력: Chris
}
}
설명: Person
객체는 참조형이기 때문에, 함수로 전달될 때 주소값이 전달됩니다. 함수 안에서 name
을 바꾸면 원본 객체에도 영향을 줍니다.
🚀 Java는 Call by Value? Call by Reference?
많은 사람들이 Java는 Call by Reference라고 생각하지만, 정확히는 Java는 오직 Call by Value만 지원합니다.
📌 "값"이 객체의 참조 주소일 뿐인 경우, 그 참조값이 복사되어 전달되므로 마치 Call by Reference처럼 보일 수 있습니다.
- 기본형 변수: 값이 복사됨 → 함수 내 변경 불가능
- 참조형 변수: 참조값이 복사됨 → 객체의 내부 상태는 변경 가능

🌱 스프링(Spring)에서는 어떻게 동작할까?
Spring은 Java 기반이기 때문에 동일하게 Call by Value 방식으로 동작합니다.
예시 (Spring Service)
@Service
public class UserService {
public void updateUser(User user) {
user.setName("Updated Name");
}
}
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/update")
public String update() {
User user = new User("Original Name");
userService.updateUser(user);
return user.getName(); // 👉 출력: Updated Name
}
}
설명: User
객체는 참조형이고, 그 참조값이 복사되어 전달되므로 updateUser
내부에서 이름을 바꾸면 원본 객체에도 영향을 줍니다.
🔍 정리
구분 | 설명 | Java 기본형 | Java 참조형 |
---|---|---|---|
Call by Value | 값 복사 | ✔️ 변경 불가 | ✔️ 참조값 복사됨 |
Call by Reference | 주소 전달 | ❌ (Java 미지원) | ❌ 직접 주소 전달 아님 |
728x90
반응형