값에 의한 호출(Call By Value) VS 참조에 의한 호출은(Call By Reference)
이 두 방식은 인자를 전달할 때 원본 값에 영향을 주는지 여부에서 큰 차이를 보인다.
Call By Value (값에 의한 호출)
값을 복사해서 전달하는 방식
호출된 메서드에서는 복사된 값을 사용하므로, 원본 값은 변경되지 않습니다.
public class CallByValueExample {
public static void main(String[] args) {
int num = 10;
changeValue(num);
System.out.println("main의 num: " + num); // 출력: 10
}
public static void changeValue(int num) {
num = 20;
System.out.println("changeValue의 num: " + num); // 출력: 20
}
}
// num 값이 메서드로 복사되어 넘어가기 때문에, changeValue에서 값을 바꿔도 원래 main의 num에는 영향이 없습니다.
Call By Reference (참조에 의한 호출)
변수의 참조(주소)를 전달하는 방식
호출된 메서드에서 원본 객체 자체를 직접 조작할 수 있다.
※ 자바는 Call By Reference를 지원하지 않는다.
하지만 객체의 주소값을 복사해서 전달하기 때문에, 객체 내부 상태는 변경할 수 있다.
class Student {
String name;
void study() {
name = "공부 중";
}
}
public class CallByReferenceExample {
public static void main(String[] args) {
Student student = new Student();
student.name = "초기 상태";
callMethod(student);
System.out.println("main의 student.name: " + student.name); // 출력: 공부 중
}
public static void callMethod(Student student) {
student.study();
System.out.println("callMethod의 student.name: " + student.name); // 출력: 공부 중
}
}
// 자바는 student 객체의 주소를 복사해서 넘깁니다.
// 즉, callMethod와 main은 같은 객체를 가리키고 있으며, 내부 상태(name) 변경이 원본에도 영향을 줍니다.
- 하지만 객체의 참조 자체를 다른 객체로 바꾸는 경우, 원본에는 영향이 없다.
- 이 경우, main 메서드의 student는 영향을 받지 않는다.
- 즉, 자바는 객체의 참조 주소값을 복사해서 전달하므로, 여전히 Call By Value
public static void callMethod(Student student) {
student = new Student(); // 새로운 객체를 할당
student.name = "새 객체";
}
자바에서 "참조값을 복사해서 전달한다"는 의미
주소값도 '값'이기 때문에 Call By Value
자바는 기본적으로 Call By Value(값에 의한 호출) 방식만 지원함
자바는 기본적으로 Call By Value(값에 의한 호출) 방식만 지원함
하지만 객체를 메서드에 전달할 때는 조금 헷갈릴 수 있다.
자바에서 객체를 인자로 전달하면, 객체의 참조값(주소)이 복사되어 전달됨
즉, 메서드 내부에서도 원본 객체를 가리키는 같은 주소를 사용
이로 인해 메서드 내부에서 객체의 속성이나 상태를 변경하면,원본 객체에도 그대로 반영
void update(Student s) {
s.name = "변경됨"; // 원본 객체의 name도 바뀜
}
그러나 메서드 내부에서 새로운 객체를 할당하면, 이 변경은 호출한 쪽에 영향을 주지 않습니다.
왜냐하면 복사된 참조값만 바뀌고, 원래의 참조는 그대로이기 때문입니다.
void update(Student s) {
s = new Student(); // 호출한 쪽의 객체에는 영향 없음
}
따라서 자바는 객체를 넘길 때도 "참조값을 값으로 복사해서 전달" 하기 때문에 여전히 Call By Value
'IT > CS 공부' 카테고리의 다른 글
| [CS] CPU 스케줄링 (0) | 2025.05.28 |
|---|---|
| [CS] 방어적 복사(Defensive Copy) (2) | 2025.05.22 |
| [CS] Redis가 싱글 스레드로 동작하는 이유 (0) | 2025.05.20 |
| [CS] CAP 정리 (0) | 2025.05.15 |
| [CS] 시스템 간 비동기 연동 방식 정리 (0) | 2025.05.14 |