본문 바로가기
Others/기본 개념들

Java는 call-by-reference 방식을 지원하는가?

by supdev 2017. 6. 16.

새벽녘 Java의 인자 전달 방식에 대한 예제를 보고는 머리가 복잡해졌다.


Java는 Call by Reference 방식을 지원하는가?

라는 물음에 따른 예제였다.



결과값

Person : 유관순


얼핏 보면 인자로 들어간 Person 객체가 '이순신'이라는 이름의 객체로 교체될 것 같지만 아니다.

하지만 아래와 같이 .(dot)연산자를 사용하면 우리가 생각했던 결과를 얻을 수 있다.



결과값

Person : 이순신



열심히 찾아보며 도달한 결론은 이렇다.


먼저 Java는 오직 call-by-value 인자 전달 방식만을 지원한다.

따라서 객체를 인자로 넘기는 경우 객체의 주소(reference)가 아닌 그 주소를 복사한 값을 인자로 전달하게 된다.

만약 Java가 call-by-reference 방식을 지원했다면 첫 번째 코드의 결과값이 바뀌었을 것이다.


위 changePerson 메서드의 경우 Person 객체의 인스턴스 p는 int형의 인자를 넘겼을 때와 마찬가지로 해당 메서드 안에서의 지역변수로 변환된다.

따라서 지역변수의 값을 아무리 변경해봐야 메서드가 종료되며 소멸된다.


하지만 아래 changeName 메서드의 경우, 인자로 복사되어 넘어온 p는 엄연한 객체의 주소 값이다.

따라서 이 주소를 통해 Person 객체의 인스턴스에 접근하여 메서드를 통해 값을 변경할 수 있다.






이렇게 정리해 놓고도 다시 한 번 생각해보면 아리송하다.

명확하게 정리될 때까지 곱씹어 볼 문제인 것 같다.

'Others > 기본 개념들' 카테고리의 다른 글

오버로딩과 오버라이딩  (0) 2017.06.16
JVM의 메모리구조  (0) 2017.06.16
객체(Object)와 인스턴스(Instance)  (0) 2017.06.16