Call by Reference와 Call by value의 가장 큰 차이점을 값을 복사햐냐 안하냐의 차이 이다.
Call by Reference는 주소 값을 전달 하고, 해당 주소의 들어있는 값을 변경하여 사용하므로 여러 곳에서 공유 되고 언제든지 바뀔수 있다.
Call by Value는 주소에 들어있는 값을 복사하여 전달한다. 즉, 복사의 대상이랑 값만 같을 뿐 아무런 관계를 갖지 않는 값을 가져온다.
자바는 Call by Reference 와 Call by Value가 같이 사용되는거 같지만 결국에는 Call by Value 이다.
왜냐하면 자바는 객체를 인자로 넘겨줄떄 객체를 주게되면 객체의 주소값을 복사해서 넘겨주기 때문이다.
public class TEst2 {
public static void main(String[] args) {
new TEst2().test();
}
void test () {
Animal a = new Animal();
a.name = "test";
test2(a);
System.out.println(a);
}
void test2 (Animal a) {
a = new Animal();
a.name ="test2";
System.out.println(a);
}
}
class Animal {
public String name;
public String toString() {
return name;
}
}
위 예제 코드를 보게되면 test2 메소드에서 a의 값을 대입하고 그 값을 콘솔에 찍는다.
이코드를 동작해보면 test2 메소드에서 찍힌 내용은 test2인것을 당연히 예상할 수 있다.
하지만 test 메소드에서 test2를 실행된 뒤에 찍힌 값은 test이다.
이를 통해 객체를 인자로 넘겨주게 되면 객체의 주소값을 복사해서 넘겨 주는거 일뿐 객체의 직접 접근하는 것은 아니다.
우리가 넘겨준 객체의 메소드를 수행해서 값을 변경하게 되면 객체 내부의 값이 변경된다고 생각하여 혼동될 수 있지만, 객체의 주소값을 복사해서 넘겨주고 그 주소를 통해서 객체의 접근 하는 것일뿐이다.