BACKEND/JAVA & SPRING

Call By Value & Call By Reference 정리

이-프 2024. 3. 11. 13:22

정렬에 대해서 다시 공부하던중.. swap 함수를 작성하면서 Call By Value와 Call By Reference의 차이점을 정확히 알지 못한다는 사실을 깨닫고 지금이라도 공부해야겠다 생각했다.. 2024년도에는 모르는 것들을 꼼꼼하게 챙겨갈 수 있는 해가 되어야지 !! 

Call By Value : 값에 의한 호출

public class CallByValue {
	public static void main(String[] args) {
		
		int a = 1;
		int b = 2;
		
		int temp = a;
		a = b;
		b = temp;
        
		System.out.println("a: "+a+" b: "+b); // a: 2 b: 1
	}
}

Call By Reference : 주소에 의한 호출

public class CallByReference {
	public static void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;
        	System.out.println("a: "+a+" b: "+b); // a: 2 b: 1
	}
	public static void main(String[] args) {
		
		int a = 1;
		int b = 2;
		
		swap(a,b);
		
		System.out.println("a: "+a+" b: "+b); // a: 1 b: 2
	}
}
  • Java는 Call By Value 방식으로 함수를 호출하기 때문에 swap이 정상적으로 작동하지 않음을 확인
  • 위의 함수를 보면, swap 함수에 int값 자체를 넘겨줬음을 확인할 수 있다.
public class CallByReference2 {
	public static void swap(*int arr[], int a, int b*) {
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	public static void main(String[] args) {
		int[] arr = {1,2,4,3,5};
		swap(arr,2,3);
		for(int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]); // 1 2 3 4 5
		}
	}
}
  • CallByReference2에서는 int[] arr 자체를 parameter로 넘겨줬음을 확인할 수 있다.
  • Java에서는 참조형 변수와 배열과 같은 경우 Call By Reference와 같은 효과를 낼 수 있다.