인프런 커뮤니티 질문&답변

이제운님의 프로필 이미지
이제운

작성한 질문수

Java TPC (생각하고, 표현하고, 코딩하고)

메서드는 변수다(실습)

call by reference 관련 자바는 call by value방식만 존재하지 않나요?

해결된 질문

작성

·

752

·

수정됨

0

엄밀하게 따지면 JAVA는 모두 call by value로 알고 있습니다.

call by reference 방식은 실제 메모리의 주소값을 전달하여 원본 자체의 주소가 바뀌는 방식으로 알고있습니다.

반면 자바에서 reference type을 메서드로 전달하여 값이 바뀌는건, 메서드내에서 reference type 의 주소를 복사받아. 주소의 변화 없이 값만 조정하는걸로 압니다.

즉 메서드 내에서 전달받은 복사된 주소값으로, 해당 객체나 배열의 값을 수정하는거지. 원본 자체의 변화는 없는걸로 학습했는데, 제가 학습한게 맞을까요?

답변 1

1

박매일님의 프로필 이미지
박매일
지식공유자

call by reference 방식은
실제 메모리의 주소값을 전달하여 -> 원본 자체의 주소를 받기 때문에 -> 받은 주소로 수정을 하게되면
원본의 내용이 바뀌게 되어 있습니다. 아래 예제를 확인해보시면 됩니다.
main에서는 a[0]가 10인데 aaa메서드에서 a[0]=40으로 수정하면
main에서 a[0]의 값이 40으로 변경된 값이 출력이 됩니다.

public class HelloWorld {
public static void main(String[] args) {
int[] a={10,20,30};
aaa(a);
System.out.println(a[0]);
}
private static void aaa(int[] a) {
a[0]=40;
}
}

이제운님의 프로필 이미지
이제운
질문자

네, 그부분은 이해했습니다.

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93

에서보면 자바는 메모리상의 실제주소를 숨기기때문에, 값을 복사하냐, 주소값을 복사하냐의 차이만 있을뿐 call by value 방식이라고 들어서 그렇습니다.

(1. 참조형 변수는 객체를 가리키고있는 레퍼런스를 저장하는것이지, 객체 주소값을 갖고있지는 않다.

2. 때문에 우리가 흔히 call by value라고 하는 기본형 변수를 인자로 넘길때 값이 복사돼서 넘어가듯 call by reference 라고 하는 객체전달시에 객체의 주소값을 가리키고있는 '레퍼런스'가 기본형 변수와 마찬가지로 복사돼서 넘어가는것이기때문에 전부다 call by value 다.

3. C++의 call by reference 는 무언가 복사해서 전달하는게 아니라 주소 그 자체를 전달하는것이다.)

즉 주소값(실제 주소가 아닌 자바의 reference)을 복사해서 call by value 동작으로 값만 전달된거고. 그 주소값으로 원본이 수정되더라도, 그건 객체 내에서 Reference로 메소드,변수에 접근해서 그런거지, 엄밀하게 call by reference 동작은 아니라고 하는 글이 많았습니다.

 

조금 더 찾아봤는데 제임스 고슬링도 자바는 call by value로 동작한다고 나옵니다..

the Java authors choose to only include one simple idea - pass-by-value, with no default values or optional parameter (overloading often provides a satisfactory alternative), no variable length parameter lists (added finally in Java 5), no named parameters, no pass-by-reference, no const (a general Java issue) parameters, etc. 

-The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling, section 2.6.1, page 40, 3rd paragraph.

박매일님의 프로필 이미지
박매일
지식공유자

번지가 16진수 값(Value)으로 보아서 전달되는 것이 값이기 때문에 Call By Value라고 볼수도 있지만 객체지향에서는 번지는 값이지만 실제 객체를 가리키기는 번지로 보기 때문에 Call By Reference(참조)라고 보는것이 의미적으로 타당 할듯합니다.^^

이제운님의 프로필 이미지
이제운
질문자

감사합니다!

이제운님의 프로필 이미지
이제운

작성한 질문수

질문하기