public class Main {
public static void main(String[] args) throws IOException {
Person a = new Person("kiseok");
change(a);
System.out.println(a.name);
}
private static void change(Person p) {
p = new Person("qwe");
//p.name="qwe";
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
결과를 예측해보자
과연 뭐라고 출력될까?
kiseok이 출력된다
왜?
자바는 call by value다
객체는 힙 영역에 생성되고 레퍼 타입은 이를 참조하는 주소값을 가진다.
그리고 레퍼타입의 경우 호출된 함수는 객체를 참조하는 새로운 주소값을 복사받고 이는 스택!!!!!!!에 저장된다
⭐️
즉 새로운 객체 new Person("qwe")는 힙 영역에 자리잡히고
함수내 p는 a의 주소값을 복사받고 이는 스택에 저장된다. 그리고 p는 새로운 객체 qwe를 향하는데
이는 결국 복사받은 주소값이 qwe를 향하고 함수 종료시 스택은 사라진다.
객체는 힙 영역에 생성되고 레퍼 타입은 이를 참조하는 주소값을 가진다. 그리고 레퍼타입의 경우 호출된 함수는 객체를 참조하는 새로운 주소값을 복사받고 이는 스택!!!!!!!에 저장된다 ⭐️ 즉 새로운 객체 new Person("qwe")는 힙 영역에 자리잡히고 함수내 p는 a의 주소값을 복사받고 이는 스택에 저장된다. 그리고 p는 새로운 객체 qwe를 향하는데 이는 결국 복사받은 주소값이 qwe를 향하고 함수 종료시 스택은 사라진다.
만약. p.name="qwe";인 경우는 주소값을 따라가 값을 직접 변경하기에 반영된다.