call by reference의 의미
우수리
[java 질문입니다]
call by reference는 주소값을 넘기기 때문에 메소드에서 인자로 넘어온 값을 변경했을 시에 그 값이 콜을 한 영역에서도 변경상태가 적용되는 것으로 알고 있습니다.
그런데 그 인자를 다른 값으로 변경하는 것은 안됩니다.
예를 들면 다음과 같은 것이지요
public void func(Map m) {m = null; // 1) null로 변경
Map mm = new HashMap();
mm.put(123,456);
m = mm; // 2) 다른 객체 값으로 변경
}
주소를 넘기기 때문에 그 주소를 참조하여 값을 변경하는 것은 가능하지만 주소 자체 변경은 불가능 하다는 말인듯 합니다.
제가 과연 옳게 생각하고 있는 것입니까?
프로그램을 하다가 저런 경우가 발생하여 질문을 드립니다.
요즘 들어서 부쩍 기초가 많이 부족하구나 라고 느끼고 있습니다. ;;
-
Creative
제가 알기로는 call by value로 하면 copy function이 수행됩니다. call by reference로 주소만 넘겨 받는게 빠른 방법이죠. string이나 pointer를 사용할때도 call by value로 하면 쓸데없는 copy에 의해 느려지게 됩니다.
위의 경우에는 call by reference로 하시려서든,
public void func(Map &m) { // &를 쓰셔야 할듯,
// m은 미리 initialize되어야겠죠? -
일본어못해요
이렇다고 하네요...
자바에서는 call by reference라는 말은 원래 없고 call by value만 존재한답니다.
객체를 넘길때는 주소값 자체가 call by value로 복사되어 넘어간다고 하네요.
따라서 메소드에서 객체를 변화시킬수 있는 것은 객체의 주소를 알수 있어서이고 그 주소를 만일 다른 주소로 대체하거나 null로 바꾼다 하더라고 주소의 복사값이기 때문에 기존의 주소를 그대로 살아 있고 단지 메소드 내부에서 그 주소를 참조할 방법이 -
방방
수다님이 하시는 생각이 맞지 않나요? 메서드인자 m은 메서드호출시의 인자가 참조하고 있는 주소를 똑같이 참조만 하고 있는 새로운 변수이기 때문에 m=null을 설정함과 동시에 그에 대한 참조는 사라진다고 생각합니다. 결국 m=mm;이 되더라고 m은 벌써 호출시에 건네준 인자의 메모리 주소를 잃었기 때문에 메인에서 설정값을 참조하는건 불가능하다고 생각합니다.
-
이룩
메소드로 넘어온 변수(위의 경우에는 m)을 변경하므로써 메소드를 호출할때 넘겨준 변수 값을 변경하는 질문이었습니다.
예를 들면 메인메소드에서 Map m을 위의 메소드로 넘겼을 시에 메소드에서 인자로 넘어온 m 값을 null로 할당을 하게 되면 그게 메인메소드에서 반영이 되는지 여부를 알고 싶었습니다.
직접 해봤을 시에 적용이 안되서 call by reference의 의미를 다시 알고자 했던 것입니다 ^^;;
메소드로 넘겨서 객체를 변경할 수 있는 이유 -
볼수록매력
음.. 어떤 질문인지 제가 파악못한걸수도, 제가 모르는 것일 수도 있지만
주소 자체를 변경한다는점이 무슨의미인지 파악을 잘 못하겠네요^^;
만약 제가 생각하는 것이라면 java 프로그래밍을 하면서 크게 신경쓸 이유가 있을까? 합니다.
물론 단순히 궁굼증이라면 모르지만^^;;