[Java] call by value
개요
자바는 reference가 아닌 value를 복사하여 전달한다.
그럼 object의 경우에는 어떨까? object를 넘길경우 해당 object의 ref 값을 복사하여 전달한다.
다음과 같은 예시를 살펴보자.
void main(String[] args) {
Person me = new Person();
me.name = "jonghoonpark";
System.out.println(STR."my name: \{ me.name }");
changeName(me, "noname");
System.out.println(STR."my name: \{ me.name }");
}
class Person {
String name;
public Person() {
}
}
public void changeName(Person person, String newName) {
person = new Person();
person.name = newName;
}
이 코드를 수행하면 어떻게 될까?
정답은 다음과 같다.
my name: jonghoonpark
my name: jonghoonpark
me 객체의 값이 바뀌지 않은 이유를 찾기위해 상태별로 구분해보면 다음과 같이 나눌 수 있다.
상태 1
me
변수에 new Person()
으로 생성된 객체를 할당한다.
상태 2
해당 object의 ref 값을 복사하여 메소드에 전달한다.
상태 3
처음의 me
를 수정하는게 아니라 new Person()
로 생성된 객체를 수정하게 된다.
만약 아래와 같이 작성했다면 일반적으로 기대하는대로 데이터가 변경이 될 것이다.
void main(String[] args) {
Person me = new Person();
me.name = "jonghoonpark";
System.out.println(STR."my name: \{ me.name }");
changeName(me, "noname");
System.out.println(STR."my name: \{ me.name }");
}
class Person {
String name;
public Person() {
}
}
public void changeName(Person person, String newName) {
person.name = newName;
}
my name: jonghoonpark
my name: noname