결론
결론부터 말하면 Java는 C계열 언어 처럼 메모리 주소를 연산, 조작할 수 없어 Call by reference를 지원하지 않는다.
즉 Call by value만 지원한다.
java에서 메모리주소에 직접적으로 접근할 수 있는 방법은 없다. 디버깅할 때 보이는 객체 아이디는 메모리 주소가 아닌 메모리주소를 단순히 해시코드로 변환하여 아이디로 보여주는것 뿐이다.
예제
public void test() {
Person p1 = new Person("Kwon");
callByValue(p1);
}
public void callBySomething(Person p2) {
p2.setName("Kim");
p2 = new Person("Lee");
}
callBySomething 메서드의 매개변수인 Person 타입의 p2 참조 변수는 인수를 통해 전달받은 p1이 가리키는 Kwon 객체를 동일하게 가리키는것이지 포인터 처럼 주소를 전달받은것이 아니다.
따라서 p2.setName(“Kim”); 코드로 heap 메모리에 Kwon 객체 주소위에 값을 “Kim”으로 간접적 접근해서 변경할 수 있지만
p2 = new Person(“Lee”); 코드를 실행한다고 해서 메서드 밖 p1이 가리키는 객체 주소를 Lee 객체가 올라가있는 주소로 변경(조작)할 수는 없다.
단지 p2라는 참조변수가 메서드 밖 p1이 가리키는 객체를 동일하게 가리키다가 새로 생성한 Lee 객체를 가리키게끔 변경한것 뿐이다.
참고
stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?answertab=votes#tab-top
'☕️ Java' 카테고리의 다른 글
Volatile (0) | 2021.05.18 |
---|---|
Thread Local 개념과 내부 구조 (0) | 2021.05.08 |
HashMap은 탐색시 어떻게 O(1)의 성능을 낼까? (0) | 2021.05.02 |
Java의 정렬 클래스 Comparable, Comparator 정리 (0) | 2021.04.18 |