자바 call by value, call by reference 관점

HEETAE HEO·2022년 6월 18일
0
post-thumbnail

함수의 호출 방식에는 Call by value와 Call by reference가 있습니다. 해석을 해서 하면 값에 의한 호출이냐, 참조에 의한 호출이냐 라고 할 수 있습니다. 그럼 어떤 차이가 있는지 예제로 확인해보겠습니다.

Call by value

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);

	}
}

출력의 결과는 다음과 같습니다.

swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20

분명히 swap 메서드를 했으니 값이 바뀌어야하는데 결과를 보면 그렇지 않습니다.

메모리에 저장되는 것을 보시면 이해가 되실 겁니다.

Main에서 생성된 a와 b의 변수의 주소와 swap을 통해 값을 메서드 내부의 매개변수 x와y의 메모리 주소가 다른 것을 확인할 수 있습니다. a와 b에서는 값만 복사가되어 x와 y에 넘어가는 것입니다.

Call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보냅니다.

Call by reference

Call by reference는 메서드 호출 시에 사용되는 인자가, 값이 아닌 주소를 넘겨줌으로써 주소를 참조하여 데이터를 변경할 수 있습니다.

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);
	}
}

이번의 결과는

swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10

main()에서 선언 된 CallByReference 타입의 변수 a와 b는 각각 객체를 생성하여 0x0001번지와 0x0005번지에 저장된 10과 20의 주소 값을 저장하게 됩니다. 이후, swap() 메서드 호출 시에 인자 a와 b는 메모리에 저장 된 주소 값을 복사하여 매개변수 x와 y의 메모리에 저장합니다. 결국 swap() 메서드는 10과 20이 저장 된 0x0001번지와 0x0005번지의 주소를 참조하여 연산하기 때문에, 연산 결과에 따라 원본 데이터가 변하게 됩니다. main()에서 선언 된 변수 a와 b는 각각 0x0001번지와 0x0005번지를 가리키고 있기 때문에 변한 데이터를 불러들여 결과 값이 변하게 됩니다.

Call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어 있는 주소를 복사하여 보냅니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글