Call By Value & Call By Reference

📌 Call By Value & Call By Reference

Call By Value : 값에 의한 호출로, 변수의 값을 매개변수로 전달하는 것
Call By Reference : 참조에 의한 호출로, 객체를 참조하는 주소를 매개변수로 전달하는 것

📌 자바는 Call By Value? Call By Reference?

결론은 자바는 Call By Value이다. 먼저 사전 지식을 알고, 예시로 보면 이해가 쉽게 될 수 있을 것 같다.

사전 지식

객체는 힙에 저장되고, 지역 변수는 스택에 저장된다. 변수에는 힙에 생성된 객체의 주소를 가진다.
메서드의 매개변수는 새로운 지역 변수를 생성한다. 따라서 값을 새로운 지역 변수에 저장하게 된다.

예시

1.
"A"라는 이름을 가지는 유저 객체를 생성하고 user라는 변수에 넣는다. 이렇게 되면 힙에 객체가 생성되고, user 변수에는 힙에 있는 객체의 주소가 담겨져있다. 이때 user 변수를 A라고 하겠다.
//1번 User user = new User("A"); //A
Java
2.
"B"라는 이름을 가지는 유저 객체로 변경하는 change() 메서드를 호출한다.
//1번 User user = new User("A"); //A //2번 change(user);
Java
3.
change() 메서드에서 매개변수에 맞는 지역 변수를 생성한다. 이 지역 변수의 이름을 B라고 하겠다. A와 B는 서로 다른 공간이라고 보면 된다.
//1번 User user = new User("A"); //A //2번 change(user); //3번 public void change(User user) { //B user = new User("B"); }
Java
4.
결과는 B로 변경되지 않는다. A와 B는 독립적인 공간이므로 힙에 있는 주소만 같다. 따라서 새로운 객체가 생성되면 메서드 내에 있는 지역 변수 B는 새로운 객체를 가리키고, 메서드를 호출하기 전 user 변수 A는 이전 객체를 가리킨다. 이로 인해 A는 이전 객체의 이름 "A"를 출력한다.
//1번 User user = new User("A"); //A //2번 change(user); //4번 System.out.println(user.getName()); //"A" 출력 //3번 public void change(User user) { //B user = new User("B"); }
Java

📌 참고 자료

TOP