후레임의 프로그래밍
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
자체의 값을 변경할 수 있습니다.
'스택오버플로우(Stack Overflow)' 카테고리의 다른 글
__name__ ==“__main__”:하면 어떻게됩니까? (0) | 2020.10.26 |
---|---|
C#에서 문자열과 문자열의 차이점은 무엇입니까? (0) | 2020.10.26 |
원격 Git 브랜치를 어떻게 확인합니까? (0) | 2020.10.26 |
왜 두 시간을 빼면 (1927년) 이상한 결과가 나오는 이유는 무엇입니까? (0) | 2020.10.26 |
var functionName = function () {} vs function functionName () {} (0) | 2020.10.26 |