면접 질문중 자바는 Call By Value와 Call By Reference중 어떤 것이냐는 질문도 있었다는 걸 들었다..
사실 이런 부분까지 생각해 본 적은 없었다.. 자바는 어떤걸까? 일단 두개가 뭔지 알고 가자


  • Call by value ?
    • 일단 정의하자면 Call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.

    보통 call by 들을 설명할 땐 swap을 많이 사용한다고 한다.

    public class ValueTest{
      public static void swap(int x, int y) {
          int temp = x;
          x = y;
          y = temp;
    
      }
          public static void main(String[] args) {
          int a = 10;
          int b = 20;
          swap(a,b);
          System.out.println(" a = " + a + ", b = " + b);
      }
    }
    

    이때 실행 시엔 어떤 값이 나올까?
    답은 a = 10, b = 20이다.(물론 x,y는 20,10으로 바뀌어있다.)
    이때 분명 호출 해서 인자를 넘겼는데 왜 이렇게 나오는 걸까?
    이는 메소드가 호출될때 swap 내부에 새로운 변수a,b(x,y)가 생성되고 원래의 값만 복사하여 넘기기때문이다.
    이는 a,b와 메소드 호출 시의 x,y가 다른 인스턴스라는 소리다.

  • Call by reference ?
    • Call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.

    이도 예제를 보도록 하자

    public class ReferenceTest{
          int value;
              ReferenceTest(int value) {
                  this.value = value;
          }
              public static void swap(ReferenceTest x, ReferenceTest y) {
                  int temp = x.value;
                  x.value = y.value;
                  y.value = temp;
          }
    
          public static void main(String[] args) {
              ReferenceTest a = new ReferenceTest(10);
              ReferenceTest b = new ReferenceTest(20);
    
              swap(a, b);
    
              System.out.println("a = " + a.value + ", b = " + b.value);
      }
    }
    
      이때는 어떤 값이 나올까?  
      우리가 원하는데로 a=20, b=10이 나오게 된다.  
      참조변수를 이용해 호출할 땐 이처럼 값이 바뀌게 된다.
    

허나 자바는 기본 자료형에 해당하는 변수를 넘길때는 값을 넘기고 변수가 레퍼런스타입인 경우 그 변수가 가지는 값이 레퍼런스 주소값으로 전달 된다고 한다.

사실 이는 예전 변수를 배울때 배웠던 것이다.
기본형 변수는 변수 자체 값을 기억하고 참조형 변수는 변수 값이 기억된 위치의 주소를 기억하기 때문이다.