skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

자바 call by value #131

Open skarltjr opened 1 year ago

skarltjr commented 1 year ago
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;
    }
}

객체는 힙 영역에 생성되고 레퍼 타입은 이를 참조하는 주소값을 가진다. 그리고 레퍼타입의 경우 호출된 함수는 객체를 참조하는 새로운 주소값을 복사받고 이는 스택!!!!!!!에 저장된다 ⭐️ 즉 새로운 객체 new Person("qwe")는 힙 영역에 자리잡히고 함수내 p는 a의 주소값을 복사받고 이는 스택에 저장된다. 그리고 p는 새로운 객체 qwe를 향하는데 이는 결국 복사받은 주소값이 qwe를 향하고 함수 종료시 스택은 사라진다.

만약. p.name="qwe";인 경우는 주소값을 따라가 값을 직접 변경하기에 반영된다.