
Call by value는 메서드 호출 시 변수의 값을 복사해서 전달하는 방식이다.
인자는 지역 변수이기 때문에 값이 변경되도 외부에 영향을 주지 않는다.
Call by reference는 메서드 호출 시 원본 변수의 주소를 전달하는 방식이다.
함수 내부에서 값을 변경하면 외부에 영향을 준다.
자바는 Call by value 방식을 사용한다.
예시를 보면서 이해해보자
public class CallByValuePrimitive {
static void change(int x) {
x = 100;
}
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a);
}
}
위 코드를 실행하면 값 변경 없이 그대로 10이 출력된다.
class Person {
String name;
}
public class CallByValueObject{
static void changeName(Person p) {
p.name = "heo";
}
public static void main(String[] args) {
Person person = new Person();
person.name = "sejin";
changeName(person);
System.out.println(person.name);
}
}
위 코드를 실행하면 heo가 출력된다.
그러면 객체는 Call by Reference 아닌가? 하고 생각이 들 수 있는데 아니다.
person에 들어 있는 참조값이 복사되어 p와 person은 같은 객체를 가리켜서
객체 내부 상태 변경은 반영된것이다.
-> 값이 바뀐 게 아니라, 가리키는 대상의 내부가 바뀐 것이다.
class Person {
String name;
}
public class CallByValueObject{
static void changeName(Person p) {
p = new Person();
p.name = "heo";
}
public static void main(String[] args) {
Person person = new Person();
person.name = "sejin";
changeName(person);
System.out.println(person.name);
}
}
위 코드를 실행하면 sejin이 출력된다.
p에 새 객체를 할당하고 p는 지역 변수여서 호출자 person에는 전혀 영향 없다.
-> 참조값도 값이기 때문에 복사본만 바뀐다.
자바는 항상 Call by Value고, 객체는 참조값이 값으로 전달된다.