다음과 같이 name 프로퍼티를 가진 Person 클래스가 정의되어있다.
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
우선 Person형 참조변수가 참조하는 대상을 변경해보자.
public class Main {
public static void changePerson(Person param) {
param = new Person("new Person");
}
public static void main(String[] args) {
Person person = new Person("before");
System.out.println("메서드 호출 전 " + person.getName());
changePerson(person);
System.out.println("메서드 호출 후 " + person.getName());
}
}
예상되는 실행 결과는 다음과 같이 person 변수가 참조하는 대상이 new person으로 변경되어야 한다.
메소드 호출 전 before
메소드 호출 후 new person
하지만 실제 실행 결과는 다음과 같이 person 변수가 참조하는 대상이 변경되지 않는다.
메소드 호출 전 before
메소드 호출 후 before
그렇다면 참조하는 대상의 프로퍼티, 즉 name 값을 바꾸는건 어떨까?
public class Main {
public static void changePerson(Person param) {
// param = new Person("new Person");
param.setName("new Person");
}
public static void main(String[] args) {
Person person = new Person("before");
System.out.println("메서드 호출 전 " + person.getName());
changePerson(person);
System.out.println("메서드 호출 후 " + person.getName());
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
실행결과
메서드 호출 전 before
메서드 호출 후 new person
name의 값이 변했음을 확인할 수 있다. changePerson 메소드의 매개변수인 param과 메인 함수에 선언된 person은 같은 인스턴스(Person(before))를 가르키지만, param과 person은 별도의 변수임을 확인할 수 있다.
즉, chagnePerson 메소드가 실행될 때, person의 참조값을 복사하여 param에 전달하는 Call By Value라는것을 알 수 있다.