///////
Search
📌

Java는 Call By Value일까요, Call By Reference 일까요?

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라고 볼 수 있다.