JAVA

[JAVA] Call by value와 Call by reference

개발로 먹고 살자 2022. 1. 6. 16:35

나는 첫 언어를 c언어로 시작을 했다.

그래서 c언어로 call by value, call by reference를 공부했었는데

문득 자바에서는 어떻게 될 지 궁금해졌다.

 

 

Call by value(값에 의한 호출)

public class CallByTest {

	public static void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;
	}

	public static void main(String[] args) {
		
		int a = 10, b = 20;
		
		System.out.println(a + " " + b);
		swap(a, b);
		System.out.println(a + " " + b);
	}
}
------------------ 출력 결과 ----------------------
10 20
10 20

temp라는 함수를 통해 변수 a,b의 값을 서로 변경하려고 했다.

하지만 값이 변경되지 않고 그대로이다.

그 이유는 메모리 주소가 다르기 때문이다.

 

함수가 호출될 때 메모리 공간에서 새로운 공간을 임시로 생성한다. 

그 후 함수가 종료가 될 때 임시로 생성된 공간은 사라지게 된다.

 

a와 b는 선언시 stack 메모리 영역에 적재가 되어있다.

그 다음 swap이라는 함수를 통해 a와 b를 받아 값을 변경할 때 stack 메모리 영역에

쌓이게 되는데 그 때 기존의 a,b가 가지고 있는 주소가 아닌 그 다음 주소에 쌓이게 된다.

그리고 함수가 종료가 되면 새로 생성된 임시 공간이 사라지게 되니

값은 변하지 않고 그대로 유지가 되는 것이다.

 

c언어에서는 포인터를 통해 값을 참조시켜 변경하였다면 자바에서는 어떻게 변경해야할까?

 

바로 객체를 생성하여 참조 변수의 값을 넘기는 것이다.

public class CallByTest {
	int value;
	
	public CallByTest(int value) {
		this.value = value;
	}

	public static void temp(CallByTest a, CallByTest b) {
		int temp = a.value;
		a.value = b.value;
		b.value = temp;
	}

	public static void main(String[] args) {
		
		CallByTest a = new CallByTest(10);
		CallByTest b = new CallByTest(20);
		
		System.out.println(a.value + " " + b.value);
		temp(a, b);
		System.out.println(a.value + " " + b.value);
	}
}
----------------- 출력 결과 ----------------------
10 20
20 10

객체안의 값이 아닌 객체가 가지는 주소를 넘기기 때문에 swap을 통해서 객체 자체의 주소가

변경되어 값이 바뀌게 되는 것이다.

 

여기서 신기한 점은 메소드 호출 시 메모리에 저장되어 있는 객체를 그대로 넘기는 것이 아니라

메모리의 주소를 복사하여 그 주소를 넘기는 것이다.

 

'JAVA' 카테고리의 다른 글

[JAVA] Collection framework  (0) 2022.01.12
[JAVA] Static Stack Heap 메모리 구조  (0) 2022.01.06
[JAVA] 정적 변수, 정적 메소드(Static)  (0) 2022.01.05
[JAVA] 접근제어자  (0) 2022.01.04
[JAVA] 오버로딩과 오버라이딩  (0) 2022.01.04