Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

후레임의 프로그래밍

Java는 참조에 의한 전달(call by value)입니까 아니면 값에 의한 전달(call by reference)입니까? 본문

스택오버플로우(Stack Overflow)

Java는 참조에 의한 전달(call by value)입니까 아니면 값에 의한 전달(call by reference)입니까?

후레임 2020. 10. 26. 12:37
질문

 

저는 항상 Java가 참조에 의한 전달을 사용한다고 생각했습니다.

하지만 몇 개의 블로그 게시물 (예 : 이 블로그)을 봤습니다. 그렇지 않다고 주장하는 것입니다

(블로그 게시물에 Java는 값에 의한 전달을 사용한다고합니다).

그 둘의 구별을 이해하지 못하는 것 같습니다.

 

어떻게 설명해야하나요?



답변

자바는 항상 pass-by-value입니다.
불행히도 우리는 객체를 전혀 처리하지 않고 대신 참조 (물론 값으로 전달됨) 라는 객체 핸들을 저글링합니다 . 선택한 용어와 의미는 많은 초보자를 쉽게 혼동시킵니다.

 

다음과 같이 진행됩니다.

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"를 반환합니다. main 내의 aDog 값은 Dog "Fifi"가있는 foo 함수에서 변경되지 않습니다. 객체 참조가 값으로 전달되기 때문입니다. 참조로 전달 된 경우 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 (aDog)를 호출 한 후의 개 이름입니다. 개체 이름이 foo (... ). foo d에서 수행하는 모든 작업은 모든 실제 목적을 위해 aDog에서 수행되지만 아닙니다. 변수 aDog 자체의 값을 변경할 수 있습니다.



출처 : http://stackoverflow.com/questions/40480