일반적으로 함수의 인자 전달 방법은 pass-by-value와 pass-by-reference로 구분할 수 있다.
먼저 두 방법의 개념을 살펴보고, 자바에서는 어떤 방법을 채택하고 있는지 알아보도록 하자.
** pass-by-value == call-by-value
Pass by value
인자가 pass-by-value 방식으로 전달될 때, callee의 인자로 넘어가는 값은 변수 원본의 복사본이다.
따라서 callee안에서 일어나는 변수의 변경사항은 원본에 영향을 끼치지 않는다.
** caller == 메서드를 호출하는 메서드, callee == caller에 의해 호출되는 메서드

Pass by reference
인자가 pass-by-referece방식으로 전달될 때, callee는 전달받은 값을 직접 참조한다. (복사본 x)
결과적으로 caller와 callee는 같은 객체를 다루게 되며, callee내부에서 전달받은 값을 변경할 경우 원본도 같이 변경된다.
Java에서의 인자 전달 방법
결론부터 말하자면 자바는 pass-by-value방식을 채택한다.
원시타입 전달


참조타입 전달


modify()에서 Foo인스턴스 a와 b를 생성했을 때

modify()에 a와 b를 넘겨 호출했을 때

modify() 메서드 내에서 b1에 새로운 Foo인스턴스를 할당했을 때
만약 pass by reference방식이었다면 클론a1, b1이 생성되지 않았을 뿐더러
메서드 내에서 b1에 새로운 객체를 할당했을 때, 원본 b가 새로운 인스턴스 b1을 가리켜야 한다.
결론
자바에서는 모든 인자가 값으로 전달된다.
참조타입의 경우 pass-by-reference로 헷갈릴 수 있으나, 객체의 참조를 직접 전달하는 것이 아닌 객체의 번지를 갖고 있는 참조변수를 복사해서 전달하기 때문에 원시타입의 전달과 마찬가지로 명백한 pass-by-value이다.
근거
다음은 JLS 8.4.1 Formal Parameters 섹션의 일부이다.
"The actual method invocation (§15.12) implicitly provides the argument expressions (possibly rewritten as described above) as the argument values to the corresponding parameter variables. These values are passed by value. [...]"
마지막 줄에 These values are passed by value라는 문구를 볼 수 있다. 이는 Java에서 메서드 호출 시 매개변수의 값이 값을 전달하는 pass-by-value 방식을 따르고 있다는 것을 명시하고 있는 것이다.
"If the type of the parameter is a primitive type, then the value is a copy of the initializer for the corresponding argument expression in the method invocation."
두 번째 인용문의 the value is a copy of the initializer라는 문구는 인자로 전달되는 값이 원본 변수의 복사본이라는 사실을 말해주고 있다.
두 인용문을 근거로 Java에서는 pass-by-value방식을 채택하고 있음을 알 수 있다.
Reference
https://velog.io/@kyy00n/Java-%EC%97%90%EC%84%9C-%ED%95%A8%EC%88%98%EC%97%90-%EC%9D%B8%EC%9E%90%EB%A5%BC-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
https://www.baeldung.com/java-pass-by-value-or-pass-by-reference
https://deveric.tistory.com/92
JAVA11 JLS(Java Language Specification) 8.4.1
https://rehtorb-algorithm.tistory.com/11
'Language > Java' 카테고리의 다른 글
| Java Raw Type의 정의와 사용 시 문제점 (0) | 2023.04.03 |
|---|---|
| Java Garbage Collector의 수집 대상이 되기 위해 참조만 끊으면 되는 걸까? (0) | 2023.03.31 |
| 자바의 배열 크기를 바꿀 수 있을까? (0) | 2023.03.26 |
| Java의 Stack자료구조 (0) | 2023.01.27 |
| [Java] 문자열을 ArrayList로 변환하는 방법 (0) | 2022.10.29 |