본문 바로가기
JAVA

call by value passing? call by reference passing?

by 김마리님 2020. 3. 23.

main 함수에서 매서드를 호출할때, 인수를 함께 호출해야하는 경우가 있다. 이 때, 인수를 호출하는 방법이 두가지가 있e다. 하나가 call by value passing, 다른 하나가 call by reference passing이다.

이름에서 알 수 있다시피, call by value passing은 값을 직접적으로 불러오는 것이고, call by reference passing은 값이 지정된 메모리 주소를 불러오는 형태이다.

 

다음의 예시를 보자.

package ch03;

public class MethodEx02 {
	
	static void 증가(int num) {
		num++;
		System.out.println("증가 num : "+num);
	}
    
	public static void main(String[] args) {
		int myNum=100;
		증가(myNum);
		System.out.println("myNum : "+myNum);    

합을 보면 메서드 내에서 진행된 myNum 계산과 main에서 진행된 myNum의 결과가 다르다. 왜 그럴까?

증가(myNum) 매서드가 시작되면 메모리에 stack 공간이 열린다. 그 공간에 지역변수 myNum=100+1=101의 계산이 진행되었다.

그러나 stack 공간은 매서드가 종료되면 값이 메모리에서 사라진다. 따라서 지역변수 myNum=101의 값은, 매서드가 종료되며 사라졌기 때문에, 사라진 이후 출력하는 myNum은 그대로 100으로 출력되는 것이다.

이렇게 직접적으로 stack 내부에 value를 넣어 진행하는 방식을 call by value passing 이라고 한다.

 

 

두 번째 예시를 보자.

package ch03;

class Data{
	int num=10;
}

public class MethodEx02 {
	
	static void 감소(Data d) {
		d.num--;
		System.out.println("감소 num : "+d.num);
	}
	
	public static void main(String[] args) {

		Data data=new Data();
		MethodEx02.감소(data);
		System.out.println("data.num : "+data.num);
		
	}
}

위와 다르게 main 내부에서 출력할 때도 같은 값이 나오는 것을 확인할 수 있다. 왜 그럴까?

다음의 코드 같은 경우는 처음에 new를 통해 heap 공간을 열었다.

이 공간 내부에 int=10; 이라는 값이 들어있다.

따라서, 다음 줄의 MethodEx02.감소(data); 에서 불러오는 것은 10이 아닌, int=10;이 들어있는 메모리의 주소 값을 대입하는 것이다. 그렇기 때문에 감소에서 받는 인수의 데이터 형태가 int가 아닌 data임을 확인할 수 있다. 이렇게 받은 값은 stack 내부에서 변화를 일으키는 것이 아닌 heap 공간에 있는 int=10; 에게 변화를 준다. heap는 전역변수의 역할을 하기 때문에 이후 main 메서드로 돌아와서도 10이 아닌, 9로 출력되는 것이다.

이렇게 매서드가 외부 heap의 메모리 주소를 가져와서 실행하는 방식을 call by reference passing 이라고 한다.

 

call by reference passing 형태는 서로 다른 메모리 공간에서 값을 참조해야할 때 많이 쓰인다.

call by value passing 형태는 결국 지역변수이기 때문에 stack 공간에서 사라지게 되는데, 이를 main 함수로 가져오기 위해서 return 을 사용한다.

	static int 증가(int num) {
		num++;
		System.out.println("증가 num : "+num);
		return num;
	}

이 때 출력하는 return함수의 데이터 타입에 따라 메서드의 데이터 타입을 바꿔주는 것도 잊지 말자.

반응형

'JAVA' 카테고리의 다른 글

문자열을 비교하는 방법. equals.  (0) 2020.03.23
5. 반복문  (0) 2020.03.23
static, heap, stack?  (0) 2020.03.20
4. 메서드  (0) 2020.03.20
3. 조건문  (0) 2020.03.20