티스토리 뷰

JAVA

[JAVA] - Call By Value vs Call By Reference

김종현 2021. 10. 9. 02:05

Java에서 메서드를 호출할 때 인자를 넘기는 방법은 Call By ValueCall By Reference두가지가 있다.


Call By Value는 값에 의한 호출이며 메서드로 인자값을 넘길 때 그 값을 복사해서 넘긴다.
이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되도 호출한쪽에서 넘긴 값은 변경되지 않는다.


Call By Reference는 참조에 의한 호출이며 메서드로 인자값을 넘길 때 해당 객체를 참조하는 주소를 넘겨준다. 이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되면호출한쪽에서 넘긴 값도 변경된다.

Call By Value

main 메서드에서 정수형 데이터 10과 20이 저장된 변수 두개를 swap 메서드의 인자로 넘겨주었다.

이때 main 메서드에서 넘긴 변수와 swap 메서드 인자로 받은 매개변수는 다른것이다. main 메서드에서 넘겨받은 값을 복사하여 swap 메서드 내부에 생성된 지역변수에 복사한 값을 저장한 것이다.


그래서 swap 메서드 내부에 생성된 지역변수의 값을 변경해도 main 메서드에서 넘겨준 변수엔 변화가 없다.

Call By Reference

이번엔 Member 타입의 참조객체를 swap 메서드의 인자로 넘겨주었다.

이때 main 메서드에서 넘긴 참조변수 member1과 member2와 swap 메서드에서 인자로 넘겨받은 member1과 member2는 서로 동일한 주소값을 참조하고 있어서 swap 메서드 내부에 값이 변경되면 main 메서드에서 넘겨준 member1과 member2도 영향을 받게된다.

 

그러면 Java는 Call By Value도 되고 Call By Reference 둘다 맞는건지 오해가 생길 수 있지만 정리하자면

Java는 Call By Value다. 왜 Call By Value인지 다음코드를 보자

swap 메서드 인자로 받은 member1과 member2에 각각 새로운 인스턴스를 할당해주었다. swap 메서드의 member1과 member2는 main 메서드에서 넘겨받은 member1과 member2와 동일한 주소값을 참조하고 있으니 swap 메서드에서 그 주소값을 변경해버리면 main 메서드에서 넘겨준 두 참조변수의 주소값도 변경이 될거리라는 오해가 생기게 되는데 그건 아니다.

 

swap 메서드 내부에서 새로운 인스턴스를 생성 후 인자로 넘어온 변수에 할당해버리면 swap 메서드 내부에 생성된 지역변수는 main 메서드에서 넘겨준 주소값과는 다른 주소값이 할당된다.

 

즉, 다시말해 main 메서드에서 넘긴값과 swap 메서드 인자로 넘겨받은 값에 새로운 인스턴스를 할당해버리면 서로 다른 주소값을 참조하고 있기 때문에 Call By Reference에서 테스트했던거와는 다른결과가 나오게 된다.

 

만약 Java가 Call By Reference였다면 swap 메서드 내부에 생성된 지역변수에 또 다른 인스턴스를 생성후 할당했을 시 위에 Call By Reference와 동일한 결과가 나왔어야 했다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함