본문 바로가기

기술면접대비

[JAVA] Call by Value? Call by reference?

자바는 Call by Value 일까? Call by reference일까?

=> Call by Value

 

 

 

함수의 호출 방식 크게 2가지 (메소드로 인자값을 넘기는 방법)

(1) Call by value (값에 의한 호출) : 인자로 받은 값을 복사하여 처리한다.

장점 : 복사하여 처리하기 때문에 안전. 원래의 값이 보존

단점 : 복사를 하기 때문에 메모리 사용량이 늘어남

 

(2) Call by reference (참조에 의한 호출) : 인자로 받은 주소를 참조하여 직접 값에 영향을 준다.

장점 : 복사하지 않고 직접 참조 하기에 빠름

단점 : 직접 참조를 하기에 원래의 값이 영향을 받음

 

 

 

1. 인자값으로 기본형을 사용했을 때

package 개념;

public class Callby {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 20;
		
		System.out.println("기본형-swap(전) num1 = "+num1 +",num2 = "+num2);
		swap1(num1, num2);
		System.out.println("기본형-swap(후) num1 = "+num1 +",num2 = "+num2);
		
	}


	private static void swap1(int num1, int num2) {
		int temp;
		
		temp = num1;
		num1 = num2;
		num2 = temp;
	}

}

결과

기본형-swap(전) num1 = 10,num2 = 20
기본형-swap(후) num1 = 10,num2 = 20

자바는 기본형 데이터를 처리할 때 Call by value 형식으로 처리!

 

 

 

2. 인자값으로 객체를 사용했을 때(wrapper 클래스)

package 개념;

public class Callby {

	public static void main(String[] args) {
		Integer num3 = 30;
		Integer num4 = 40;
		System.out.println("wrapper클래스-swap(전) num3 = "+num3 +",num4 = "+num4);
		swap2(num3, num4);
		System.out.println("wrapper클래스-swap(전) num3 = "+num3 +",num4 = "+num4);
		
	}

	private static void swap2(Integer num3, Integer num4) {
		Integer temp;

		temp = num3;
		num3 = num4;
		num4 = temp;
		
	}
    
}

결과

wrapper클래스-swap(전) num3 = 30,num4 = 40
wrapper클래스-swap(전) num3 = 30,num4 = 40

객체 또한 메소드로 값이 전달될 때 그 참조 값은 Call by value의 형태로 전달됨!

 

 

3. 인자값으로 객체를 사용했을 때(커스텀 클래스)

package 개념;

public class Callby {

	static class CustomClass {
		int num;

		public CustomClass(int num) {
			this.num = num;
		}
	}
	
	public static void main(String[] args) {
		CustomClass num5 = new CustomClass(10);
		CustomClass num6 = new CustomClass(20);
		System.out.println("Custom클래스-swap(전) num5 = "+num5.num +", num6 = "+num6.num);
		swap3(num5, num6);
		System.out.println("Custom클래스-swap(후) num5 = "+num5.num +", num6 = "+num6.num);
		
	}

	private static void swap3(CustomClass num5, CustomClass num6) {
		int temp;
		
		temp = num5.num;
		num5.num = num6.num;
		num6.num = temp;
	}



}

결과

Custom클래스-swap(전) num5 = 10, num6 = 20
Custom클래스-swap(후) num5 = 20, num6 = 10

 

객체의 참조값을 직접 바꾼것이 아니라 객체의 참조값을 통해서 그 객체의 멤버변수에 접근하여 그 값을 바꿈

 

 

자바는

체를 메소드로 넘길 때 객체를 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라

그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하여

그 것을 통하여 같은 객체를 가리키도록 하는 방식

 

 

참고
https://codingplus.tistory.com/29
https://hyoje420.tistory.com/6