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
기능으로 변경되지 foo
와 Dog
"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)
호출 후 개의 이름입니다. foo
가 d
수행하는 모든 작업은 모든 실용적인 목적을 위해 aDog
에서 aDog
자체의 값을 변경할 수 는 없습니다.
출처 : https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
728x90
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
자바에서 확인 된 예외와 확인되지 않은 예외 이해 (0) | 2021.10.14 |
---|---|
Java가 정적 메서드 재정의를 허용하지 않는 이유 (0) | 2021.10.13 |
Java에서 명령 줄 인수를 구문 분석하는 방법 (0) | 2021.10.06 |
Java에서 public, protected, package-private, private의 차이점 (0) | 2021.10.05 |
volatile 키워드는 어디에 사용할 수 있을까? (0) | 2021.10.01 |