java는 call-by-value이다!
자바에서는 객체의 주소를 가져오는 방법이 없다.
흔한 오해는, 아래의 코드와 같은 부분에서 생긴다.
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("jake");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p.name = "jay";
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
결과:
p.name: jake
p.name: jay
값이 변경되었다. 음? call-by-reference인걸?
아니다!! 실제 상태 값을 바꾸는 것에서 오해가 생긴다.
call-by-reference라면 상태를 변경하는게 아니라 실제 call-by-value함수의 p에 다른 Person 객체를 넣어 바뀐다면 그게 call-by-reference이다.
public class CallByValue {
public static void main(String[] args) {
Person p = new Person("jake");
System.out.println("p.name: " + p.name);
callByValue(p);
System.out.println("p.name: " + p.name);
}
public static void callByValue(Person p) {
p = new Person("jay");
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
결과:
p.name: jake
p.name: jake
이렇게 하면 값이 바뀌지 않는다.
즉, call-by-reference라면 값이 변경되어야 하는데 동일하다!