Java

함수 호출 방식 call by value, call by reference

hs_developer 2022. 5. 21. 18:15

call by value

: 값에 의한 호출

: 메소드로 인자 값을 넘길 때 그 값을 복사해 넘기는 형태

: 메소드 호출 시 메소드 내에서는 복사 된 값으로 작업을 하기 때문에 원래의 값을 변경시키지 않는다.

call by reference

: 참조에 의한 호출

: 메소드로 인자 값을 넘길 때 그 객체를 참조하는 주소를 넘겨주는 형태

: 메소드 내에서도 원래의 값에 접근해 변경 가능하다.

 

 

 

 

Call by value 인자 값으로 기본 형 사용

before
num1 = 10
num2 = 20
after
num1 = 10
num2 = 20
	static void swap(int num1, int num2)
	{
		int temp;
		
		// 자리 바꾸기
		temp = num1;
		num1 = num2;
		num2 = temp;
	}

	public static void main(String[] args) {
		
		int num1 = 10, num2 = 20;
		
		System.out.println("before");
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
		
		swap(num1, num2);
		
		System.out.println("after");
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
	}

 

swap 메소드를 호출한 후에도 그대로 값이 유지된다.

메소드 안에서 값 변경 시 원본 데이터가 바뀌지 않는 것을 알 수 있다.

메소드 내에서 두 수를 바꾸는 건 단지 복사된 값을 바꾸는 것에 불과하다.

 

 

 

 

call by reference 인자 값으로 객체 사용 (커스텀 클래스 사용)

before
num1 = 10
num2 = 20
after
num1 = 20
num2 = 10
class Number
{
	int num;
}

public class reference {
	
	static void swap(Number n1, Number n2)
	{
		int temp;
		
		temp = n1.num;
		n1.num = n2.num;
		n2.num = temp;
	}
	

	public static void main(String[] args) {
		
		Number n1 = new Number();
		Number n2 = new Number();
		
		n1.num = 10;
		n2.num = 20;
		
		System.out.println("before");
		System.out.println("num1 = " + n1.num);
		System.out.println("num2 = " + n2.num);
		
		swap(n1, n2);
		
		System.out.println("after");
		System.out.println("num1 = " + n1.num);
		System.out.println("num2 = " + n2.num);
	}
}

 

객체의 참조 값을 직접 바꾼 것이 아니라 객체의 참조 값을 통해서 그 객체의 멤버 변수에 접근해 값이 변경되었다.

 

 

참고

https://hyoje420.tistory.com/6

'Java' 카테고리의 다른 글

멤버 변수  (0) 2022.05.24
자바 은닉화: 캡슐화 encapsulation  (0) 2022.05.24
boolean형에 while문  (0) 2022.05.14
toString()과 String.valueOf()  (0) 2022.05.13
Arrays.toString() 배열 출력하기  (0) 2022.05.13