자는 call by reference를 지원하지 않는다.
자바는 값을 복사해서 전달하기 때문이다.
값을 복사한다는 의미는 아래의 실험에서 확인할 수 있다.
public class Person {
private int age;
public Person(int age){
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person john = new Person(20);
System.out.println(john.getAge()); // 20
changeAge(john, 30);
System.out.println(john.getAge()); // 30
}
public static void changeAge(Person person, int age){
person.setAge(age);
}
}
changeAge 메소드는 인자값으로 참조변수(john의 주소)를 넘겨 받았다.
그렇기 때문에 chageAge 메소드 내의 참조변수 person은 john이 가리키는 힙의 Person 인스턴스를 똑같이 가리키게 된다.
그렇기에 person.setAge() 메소드가 수행되면 아래와 같이 원본 인스턴스가 변경되게 된다.
아래의 코드는 어떨까
public class Test {
public static void main(String[] args) {
Person john = new Person(20);
System.out.println(john.getAge()); // 20
changeAge(john, 30);
System.out.println(john.getAge()); // 20
}
public static void changeAge(Person person, int age){
person = new Person(age);
}
}
changeAge의 person은 처음엔 위와 동일하게 john의 인스턴스를 가리킨다.
하지만 person = new Person(age)코드가 수행되면 아래와 같이 person은 더이상 john의 인스턴스가 아닌 새로 생성된 Person인스턴스를 가리키게 된다.
그러므로 원본 인스턴스는 변화에 영향을 받지 않는 것이다.
만약에 C/C++ 처럼 주소값을 전달했다면 john이 가리키는 메모리가 new Person이 되었을 것이다.
하지만 자바는 john이 참조하는 값을 복사해서 person 이라는 변수에 저장했기에 원본과 같은 위치를 가리키고 있어도 엄연히 다른 변수라는 것이 내 결론이다.
헷갈릴 수 있으니 기억하도록 하자
자바는 call by reference를 지원하지 않는다.
자바는 call by reference를 지원하지 않는다.
자바는 call by reference를 지원하지 않는다.
'의문과 실험' 카테고리의 다른 글
[Java] 싱글톤과 Static은 뭐가 다를까? (0) | 2023.07.03 |
---|---|
[JAVA] Vector는 Thread-Safe 한가? (0) | 2023.04.21 |
[JAVA] 오라클 공식 문서에도 없는 String pool은 도대체 무엇인가? (0) | 2023.04.03 |
[JAVA] int num = 1; num이 가리키는 메모리는 '값'을 가지는가? (0) | 2023.04.02 |
[JAVA] int num = 1; num은 어떻게 '값'을 가지며, 비교될까 (0) | 2023.03.27 |