본문 바로가기
Computer & Program/Java

[Java]Call by value / reference

by TDRemon 2014. 10. 28.
반응형


Java가 워낙 API가 막강하다보니 왠만하면 신경 안쓰고 넘어가는 부분인데 누구나 한번쯤은 궁금해 지는 것이 Java는 Call by reference냐 Call by value냐 이다. 그래서 확인해 봤다.


가장 대표적인 예시는 swap함수 일 것이다. Call by value라면 값이 바뀌지 않을 것이고 Call by reference라면 바뀔 것이다. 우선... 아래 코드는 누가봐도 안 될 것 같지만 그래도 한번 확인해보자.


========== Result ==========

a : 11

b : 17


단순히 변수 2개 추가하고 switchValue라는 함수를 통해서 값을 바꾼 후 출력해 보았다. 당연히 안 바뀐다. 위와 같이 Primitive type의 값들은 값을 복사해서 넘겨주는 것 뿐이다. 즉, Call by value이다. 그렇다면 Object 타입들은 어떨까?


========== Result ==========

a : 11

b : 17


역시나 안된다... 찾아보면 알겠지만 Primitive type은 Call by value이고 Object type은 Call by reference이다. 근데도 안된다. 참고로 switchValue() 안에 있는 Object a, b의 hashCode() 값은 넘겨주기 전의 a, b의 hashCode() 값과 동일하다. 그렇단말은 Call by reference가 맞기는 맞는데 왜 안되는 것일까?


========== Result ==========

a : 17

b : 11


된다. 2번째 코드와 비교해보면 일목요연한데 결론만 말하면 2번째 코드와 같이 하게되면 switchValue에서의 Object a, b는 swapTest에서 생성한 객체들이 가리키고 있는 메모리를 가리키고 있는 변수이다. 이 2개를 swap을 한다고 해서 실제 값이 swap 될리는 없다. 단순히 switchValue 안의 변수 a, b가 가리키고 있는 값이 swap 된 것 뿐이다. 그렇기때문에 실제 값을 swap하기 위해서는 위와 같이 값을 바꿔줘야 하는 것이다.


만약 RefValTest 클래스에 Field 값이 data 외에 여러가지 있다면 위의 코드로는 오직 data 값만 swap이 될 것이다. 정말로 넘겨준 object 들을 통채로 swap 하고 싶다면 값들을 일일히 바꿔 주던지, 아니면 return a, b를 해주면 될 것이다. 참고로 return a, b는 Java에서는 안되는 문법이므로 시도해보지 말도록...

반응형

'Computer & Program > Java' 카테고리의 다른 글

[Java] String.format  (0) 2020.06.23
[Java]Garbage Collection  (0) 2014.10.29
[Java]추상 클래스 & 인터페이스  (0) 2012.03.11
[Java]접근제한자  (0) 2012.03.11
[Java]제한자  (0) 2012.03.04

댓글