메서드 호출 시 값이나 참조를 어떻게 전달할 것인지에 따라 프로그램의 동작이 달라진다.
Java와 Spring에서 사용하는 Call by Value와 Call by Reference 개념을 정리하고,
둘의 차이점과 사용 사례를 통해 어떻게 코드가 작동하는지 이해할 수 있었다.
✅ Call by Value (값에 의한 호출)
개념
Call by Value는 메서드에 전달된 값을 복사하여 사용한다는 의미다.
메서드 호출 시, 인자의 값이 메서드로 복사되고, 메서드 내에서 이 값을 변경하더라도 원본 값은 변경되지 않는다.
예시 코드
public class CallByValueExample {
public static void main(String[] args) {
int a = 10;
modifyValue(a); // 값에 의한 호출
System.out.println(a); // 출력: 10
}
public static void modifyValue(int num) {
num = 20; // num만 변경, 원본 변수는 영향을 받지 않음
}
}
왜 중요한가?
Call by Value는 기본 자료형에 대해 주로 사용된다. 메서드 내에서 값이 바뀌어도 원본 값은 변경되지 않기 때문에, 값 전달 시 불변성을 유지할 수 있다.
✅ Call by Reference (참조에 의한 호출)
개념
Call by Reference는 메서드에 변수의 참조(메모리 주소)를 전달하는 방식이다.
이 경우 메서드 내에서 해당 참조를 통해 객체를 수정하면, 호출자의 변수도 변경된다.
예시 코드
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class CallByReferenceExample {
public static void main(String[] args) {
Student student = new Student("Alice", 20);
modifyObject(student); // 참조에 의한 호출
System.out.println(student.name); // 출력: Bob
}
public static void modifyObject(Student s) {
s.name = "Bob"; // 객체의 상태를 수정
}
}
왜 중요한가?
Call by Reference는 객체를 메서드로 전달할 때 사용된다. 객체의 속성을 수정할 수 있기 때문에, 객체의 상태 관리에 유용하다.
✅ Spring에서의 호출 방식
Spring에서 메서드를 호출할 때, 기본적으로 Call by Value 방식을 따른다.
하지만 객체를 참조로 전달할 때는 객체의 상태를 변경할 수 있다.
그러므로, Spring에서는 객체의 속성만 변경할 수 있고, 객체 자체를 대체하는 것은 불가능하다.
예시 코드:
@Component
public class MyService {
public void updateName(Student student) {
student.setName("Bob"); // 객체의 속성 변경
}
}
왜 중요한가?
- 객체를 참조로 전달하면 객체의 속성만 변경할 수 있다. 객체 자체를 대체하는 것은 불가능하므로, Spring에서는 객체의 속성만을 안전하게 변경하는 방식으로 동작한다.
✅ 결론
- Call by Value: 메서드에 값을 복사하여 전달, 메서드 내에서 값이 변경되어도 호출자 변수에는 영향을 미치지 않는다.
- Call by Reference: 메서드에 변수의 참조(메모리 주소)를 전달, 메서드 내에서 변수의 상태를 변경하면 호출자 변수도 변경된다.
- Spring에서는 객체의 속성만 변경 가능하고, 객체 자체를 다시 할당하는 것은 불가능하다.
이렇게, Call by Value와 Call by Reference의 차이를 이해하면, 자바의 메서드 호출 시 어떻게 값이 전달되고 처리되는지 명확히 파악할 수 있다.
Spring에서 객체를 참조로 전달하고 상태를 변경하는 방식은 효율적이고 예측 가능한 코드를 만들 수 있게 도와준다.
'CS공부 > Java & Spring' 카테고리의 다른 글
| MVC 모델이란 무엇인가? (0) | 2025.04.23 |
|---|---|
| 자바 컴파일 과정 (0) | 2025.04.23 |
| Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리 (0) | 2025.04.22 |
| Spring Boot @Transactional 어노테이션 (0) | 2025.04.22 |
| Spring Boot 프로젝트 horong 리팩토링 (1) | 2025.04.22 |