Java는 Call by reference를 지원할까?

결론

 

결론부터 말하면 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