Java - Call By Value vs Call By Reference
1. Call By Value
- 값에 의한 전달을 말하며, 복사된 데이터를 함수에 전달하기에 그 값에 변동이 생겨도 원본에는 변화가 없다.
2. Call By Reference
- 원본의 참조값을 그대로 전달하는 것이며, 함수 내에서 값이 변할 시 원본에도 변화가 적용한다.
3. Java는 Call By Value 다.
- 자바는 기본적으로 Call By Value 방식을 따른다.
- 우리가 객체를 넘기더라도, 그 객체의 참조 주소값을 복제해서 보낼 뿐 원본을 그대로 보내지 않는다.
public void testMethod(int a) { a = 50; }
- 이렇게 했을 때, 해당 메서드가 끝나면 저 50은 없는거나 마찬가지이다.
public void testMethod(TestClass t) { t.num = 50; }
- 이럴 경우에는 실제로 원본의 t 객체 안의 num이라는 변수의 값는 50으로 변한다.
- 그 이유는 Call By Reference 이기 때문이 아니라, 복제한 참조 변수로 접근을 하여 그 안에 있는 필드 값에 접근했기 때문이다.
public void testMethod(TestClass t) { t = new TestClass(); }
- 이럴경우 해당 메서드가 끝나면 저 new TestClass()는 사라지고 GC의 대상이 된다.
- 그건 자바가 Call By Value이기 때문이다. Call By Reference였다면 저 new 된 객체 값이 원본에도 적용됐을 것이다.
- 이처럼 복사된 객체 주소에 접근하여 필드 값을 변경할 수는 있지만 , 복사된 참조값이기 때문에 그 객체 원본 자체를 바꿀 수는 없다.