출처
StackOverflow - Is Java "pass-by-reference" or "pass-by-value"?
여기로 가서 아래 코드 전체를 그대로 붙여넣고 Run 버튼으로 실행
// Online Java Compiler
// Use this editor to write, compile and run your Java code online
class Foo {
String bar;
Foo(String bar) { this.bar = bar; }
String getBar() { return this.bar; }
void setBar(String bar) { this.bar = bar; }
}
class HelloWorld {
private void changeRef1(Foo b) {
Foo c = new Foo("barC");
b = c;
}
private void changeRef2(Foo b) {
b.setBar("barB");
}
public static void main(String[] args) {
HelloWorld ex = new HelloWorld();
//
Foo a = new Foo("barA");
System.out.println(a.getBar()); // 출력 : "barA"
// 아래에 의해,
// 참조가 없는(null) b 변수는 a 와 동일한 참조를 바라보게 된다.
// changeRef1 메서드 내에서, b 변수가 c 와 동일한 참조를 바라보도록 변경한다.
ex.changeRef1(a);
// 변수 a 는 여전히 barA 인 Foo 를 바라보고 있으므로
// 아래 출력 시, barA 가 출력된다.
System.out.println(a.getBar()); // 출력 : "barA"
// 아래에 의해,
// 참조가 없는(null) b 변수는 a 와 동일한 참조를 바라보게 된다.
// changeRef2 메서드 내에서, b 변수가 참조하고 있는 Foo 의 bar 값이 barA 에서 barB 로 변경된다.
ex.changeRef2(a);
// 변수 a 와 b 가 함께 참조하고 있는 (barA 였던) Foo 의 bar 값이 barB 로 변경되었으므로,
// 아래 출력 시, barB 가 출력된다.
System.out.println(a.getBar()) // 출력 : "barB"
}
}