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 된 객체 값이 원본에도 적용됐을 것이다.
    • 이처럼 복사된 객체 주소에 접근하여 필드 값을 변경할 수는 있지만 , 복사된 참조값이기 때문에 그 객체 원본 자체를 바꿀 수는 없다.






results matching ""

    No results matching ""