Call by Value
•
메서드 호출 시 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사해서 보낸다
•
인자로 전달되는 변수를 함수의 매개변수에 복사
◦
인자로 전달한 변수와는 별개의 변수가 된다
◦
매개변수를 변경해도 원래의 변수에는 영향을 미치지 않는다
•
원본 값을 바꿀 필요가 없는 경우에 Call by value 방식을 이용
•
원시 자료형(primitive type)은 Call By Value로 동작
◦
int, short, long, float, double, char, boolean
예제
코드
Class CallByValue{
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
swap(a, b);
System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
}
}
Java
복사
결과
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20
Plain Text
복사
•
swap() 에서 내부적으로 값은 변했으나, 실제 main 에서의 변수는 그대로인 상태
•
변수를 주소를 통해 가져온 것이 아니고 새로운 변수를 만들어 처리한 것
•
메서드 호출 시 0x0017 , 0x0013 , 0x0009 주소로 임시의 공간이 생성된다
→ 메서드 종료 시 해당 메모리 공간은 사라진다
Call By Reference
•
Call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.
•
인자가 아닌 메모리의 주소를 전달
◦
주소를 참조하여 데이터를 변경할 수 있다
•
참조 자료형(reference type)은 Call By Reference로 동작
◦
Array, Class Instance
코드
Class CallByReference{
int value;
CallByReference(int value) {
this.value = value;
}
public static void swap(CallByReference x, CallByReference y) {
int temp = x.value;
x.value = y.value;
y.value = temp;
}
public static void main(String[] args) {
CallByReference a = new CallByReference(10);
CallByReference b = new CallByReference(20);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
swap(a, b);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
}
}
Java
복사
결과
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10
Plain Text
복사
•
swap() 을 통해 메모리의 주소값을 저장한다
•
주소를 참조하여 연산해서 연산 결과에 따라 원본 데이터가 변한다
Java 는 Call By Value 인가, Call By Reference인가?
•
참조에 의한 값 변환을 사용할 수 있는 것처럼 보이지만, 결국 메모리의 주소값을 넘겨주고 호출하는 방식이기 때문에 Call By Value라고 볼 수 있다.