코딩항해기

[JAVA] 자바의 Call by Value, Call by Reference 본문

JAVA

[JAVA] 자바의 Call by Value, Call by Reference

miniBcake 2024. 7. 3. 17:02

 

 

먼저 결론부터 이야기하면 자바는 Call by Reference방식을 지원하지 않는다.

C언어와 달리 자바에서는 포인터를 숨겨 직접 메모리 주소에 접근하지 못하기 때문이다.

Call by Reference 같은 모습을 보여줄 수 있지만, 값을 불러오는지 참조값을 불러오는지의 차이일 뿐,실제 Call by Reference는 아니다.

 


 

Call by Value, Call by Reference ?

Call by ~~란, 메소드 호출 시 매개변수를 전달하는 방식을 의미한다.

값의 의한 호출인 Call by Value와 참조에 의한 호출인 Call by Reference로 분류된다.

 

Call by Value (pass by value) 값에 의한 호출

호출 메소드에 인수로 전달되는 것은 변수의 '값'으로

메소드 내에서 매개변수 값을 변경하더라도 원본 변수의 값은 변경되지 않는다.

int num = 52;

public void changeNum (int num){
	num+=10;
    syso(num);
}

changeNum(num); //62로 출력되지만,
syso(num) == 52; // 원본 변수 num의 값은 여전히 52이다.

 

 



Call by Reference (pass by reference) 참조에 의한 호출

메소드의 인수로 전달되는 것의 변수의 참조(주소)인 것이다.

메소드 내에서 매개변수를 통해 참조된 객체를 변경하면 원본 변수의 값도 변경된다

int[] nums = {1,2,3,4,5};

public void changeArray(int[] numbers){
	for(int num : nums){
		num += 10;
	}
    syso(nums); //참조주소값이 나오지만 편의상 배열값으로 대체
}

changeArray(nums);
//{11,12,13,14,15}

syso(nums); //참조주소값이 나오지만 편의상 배열값으로 대체
//{11,12,13,14,15}


이렇게 보면 자바에서 원시타입은 Call by Value, 참조(new)타입은 Call by reference처럼 보이지만,

자세하게보면 이 방식도 참조값을 넘기는 부분만 다를 뿐, 값을 복사하여 넘긴다는 점에서 Call by Value 방식이다.
자바는 Call by Value만을 지원하기 때문에 Call by Reference는 구현할 수 없다.

 

이렇게 참조값을 보내는 걸 자바에서는 Call by Address 방식이라고 구분 짓기도 한다.

외부 관점으로 보면 Call by Address나 Call by Reference나 차이가 없다.

 

(call by value 값 복사 / call by address 참조값 복사)

'JAVA' 카테고리의 다른 글

[JAVA] 다형성  (0) 2024.07.07
[JAVA] Up casting, Down casting  (0) 2024.07.04
[JAVA] 메소드 / 메서드  (0) 2024.07.03
[JAVA] 추상클래스, 추상메소드  (0) 2024.07.03
[JAVA] static, static 블록  (1) 2024.07.02