프로그래밍 언어/JAVA

Java는 "참조에 의한 전달" 일까? "값에 의한 전달" 일까?

Rateye 2021. 10. 13. 11:54
728x90
반응형

 

질문 : Java는 "참조에 의한 전달"또는 "값에 의한 전달"입니까?

나는 항상 Java가 pass-by-reference를 사용한다고 생각했습니다.

그러나 저는 그렇지 않다고 주장하는 블로그 게시물 (예 : 이 블로그 )을 몇 개 보았습니다 (블로그 게시물에서는 Java가 값에 의한 전달을 사용한다고 말합니다).

나는 그들이 만드는 구별을 이해하지 못한다고 생각합니다.

설명은 무엇입니까?

답변

Java는 항상 값에 의한 전달 입니다. 불행히도 우리가 객체를 다룰 때 우리는 실제로 값으로 전달되는 참조라고 불리는 객체 핸들을 다룹니다. 이 용어와 의미는 많은 초보자를 쉽게 혼동합니다.

다음과 같이 진행됩니다.

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

위의 예에서 aDog.getName() 은 여전히 "Max" 반환합니다. 값 aDog 내의 main 기능으로 변경되지 fooDog "Fifi" 오브젝트 레퍼런스 값에 의해 전달한다. 참조로 전달 된 경우 main aDog.getName()foo 호출 후 "Fifi" 반환합니다.

마찬가지로:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

위의 예에서 Fifi foo(...) 내부에 설정 되었기 때문에 foo(aDog) 호출 후 개의 이름입니다. food 수행하는 모든 작업은 모든 실용적인 목적을 위해 aDog 에서 aDog 자체의 값을 변경할 수 는 없습니다.

출처 : https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
728x90
반응형