Call By Value
값에 의한 호출이다. 이 방식에서는 메서드 호출 시 전달되는 값이 메서드 내부로 복사되어 전달된다. 즉, 메서드 내부에서 매개변수 값을 변경하더라도, 그 변경이 호출자에게 영향을 미치지 않는다.
void updateValue(int value) {
value = 50;
}
public static void main(String[] args) {
int value = 30;
System.out.println("Before: " + value); // Output: Before: 30
updateValue(value);
System.out.println("After: " + value); // Output: After: 30
}
위의 예제에서 'updateValue' 메서드는 매개변수로 받은 값을 변경하려고 시도한다. 그러나 이 변경은 'updateValue' 메서드 내에서만 유효하며, 'main' 메서드 내의 'value' 변수에는 아무런 영향을 미치지 않는다.
Call by Reference
참조에 의한 호출이다. Java는 사실상 참조에 의한 호출을 지원하지 않는다. 그러나 객체를 매개변수로 전달할 때, 그 객체의 "참조 값"이 복사되어 전달되므로 이를 "참조에 의한 호출"로 잘못 이해하는 경우가 있다.
class Test {
int value;
}
public static void updateValue(Test t) {
t.value = 50;
}
public static void main(String[] args) {
Test test = new Test();
test.value = 30;
System.out.println("Before: " + test.value); // Output: Before: 30
updateValue(test);
System.out.println("After: " + test.value); // Output: After: 50
}
이 경우, 'updateValue' 메서드는 객체의 참조를 매개변수로 받아 객체 내부의 필드 값을 변경한다. 이때 변경이 호출자에게 영향을 미치는데 참조가 가리키는 실제 객체의 값을 변경했기 때문이다. 그러나 이 것은 "참조 값의 복사"에 의한 것이므로, 순수한 Call by Reference라고 부르기는 어렵다. 왜냐하면, 메서드 내에서 전달받은 참조 자체를 변경하더라도, 그 변경이 호출자에게 영향을 미치지 않기 때문이다.
참조 자체를 변경하는 예시 코드:
class Test {
int value;
}
public static void updateValue(Test t) {
t = new Test();
t.value = 50;
}
public static void main(String[] args) {
Test test = new Test();
test.value = 30;
System.out.println("Before: " + test.value); // Output: Before: 30
updateValue(test);
System.out.println("After: " + test.value); // Output: After: 30
}
따라서 Java는 기본적으로 "Call by Value"를 사용하되, 객체를 전달할 때는 "참조 값의 복사"를 이용한다.
C/C++과 Java의 차이
C/C++
C/C++는 매개변수를 전달하는 두 가지 방식, 즉 Call by Value와 Call by Reference를 모두 지원한다.
Call by Value: 이 방식은 매개변수를 함수에 전달할 때, 실제 값이 복사되어 전달된다. 따라서 함수 내에서 매개변수 값을 변경하더라도 호출자에게 영향을 주지 않는다.
Call by Reference: 이 방식은 매개변수를 함수에 전달할 때, 실제 변수의 주소값을 전달한다. 따라서 함수 내에서 매개변수 값을 변경하면, 그 변경이 호출자에게도 반영된다. 이 방식은 '&' 연산자 또는 포인터를 이용해 구현할 수 있다.
Java
Java는 기본적으로 Call by Value만 지원한다.
'Languages > Java' 카테고리의 다른 글
[Java] Casting (0) | 2023.08.10 |
---|---|
[Java] 문자열 클래스 & 오브젝트 클래스 (0) | 2023.08.10 |
[Java] 직렬화 (Serialization) (0) | 2023.07.31 |
[Java] 오토 박싱(Autoboxing) & 오토 언박싱(Unboxing) (0) | 2023.07.31 |
[Java] Primitive Type & Reference Type (0) | 2023.07.31 |