본문 바로가기
CS/JAVA

Call by value와 Call by reference, 비슷한 이름이지만 전혀 다른 두 친구

by upswp 2021. 3. 20.

Call by value

값에 의한 호출

함수가 호출 될 때, 메모리 공간 안에서는 함수를 별도의 임시공간이 생성된다.(종료 시 해당 공간이 사라짐)

Call by value 호출 방식은 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달한다.

이때 복사된 함수 인자에서 지역적으로 사용되기 때문에 local value 속성을 가진다.

따라서 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경이 안된다.

 

Class CallByValue{

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;
    System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
  
    swap(a, b);
  
    System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
  }

}

 

 

swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20


Call by reference

참조에 의한 호출

Call by reference 호출 방식은 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다.

따라서 함수 안에서 인자 값이 변경되면, argument로 전달된 객체의 값도 변경된다.

Class CallByReference{

  int value;

  CallByReference(int value) {

    this.value = value;

  }

  public static void swap(CallByReference x, CallByReference y) {

    int temp = x.value;

    x.value = y.value;

    y.value = temp;

  }

  public static void main(String[] args) {

    CallByReference a = new CallByReference(10);

    CallByReference b = new CallByReference(20);

    System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

    swap(a, b);
 
    System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

  }

}
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10

reference
단어 뜻 그대로 '참조'라는 뜻이다. 참조는 대상이 있어야 의미가 있고 reference에는 항상 참조하고 있는 대상이 있게 된다.
reference 자체는 무언가 참조하고 있고 참조를 따라가면 가리키고 있는 대상이 나타난다.
argument VS parameter
argument : 인수를 뜻하며 함수를 호출할때 이때 사용되는 일련의 값들을 argument라고 부른다.
parameter : 매개변수를 뜻하며 함수를 정의할때 외부로부터 받아들이는 임의의 값을 의미한다.

 


Call by value의 경우, 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다. 하지만 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.

 

Call by reference의 경우 메모리 공간 할당 문제는 해당되지 않지만, 원본 값이 변경될 수 있다는 위험이 존재한다.