본문 바로가기
IT/Java

call by value / call by reference

by 성준하이 2023. 1. 5.
반응형
자바에서는 함수를 호출할때 2가지 방법이 있다.

1. call by value (값에 의한 호출)

  • 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (c++의 경우 stack frame) 함수가 종료되면 해당 공간은 사라진다.
  • 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
  • 복사된 인자는 함수 안에서 지역적으로 사용하는 변수이다.
  • JAVA의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (기본자료형 / 참조자료형 ) 함수 호출 방식이 달라짐
    • 기본 자료형 : call by value 로 동작 (int, short, long, float, double, char, boolean)
    • 참조 자료형 : call by reference 로 동작 (Array, Class Instance) 

 

2. call by reference (참조에 의한 호출)

  • 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (예: stack frame) 함수가 종료되면 해당 공간은 사라진다.
  • call by reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.) 
  • 함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀐다. 

 

예시 코드는 아래와 같다.

#include <iostream>
using namespace std;

//두 수를 함수 내에서 바꿉니다.
void func_by_value(int a, int b) {
   int temp = a;
   a = b;
   b = temp;
}

//두 수를 함수 내에서 바꿉니다.
void func_by_ref(int & a, int & b) //포인터로도 구현 가능 {
   int temp = a;
   a = b;
   b = temp;
}

int main(void)
{
   int a = 10;
   int b = 20;
   cout << "before function" << endl;
   cout << "a : " << a << endl;
   cout << " b : " << b << endl<<endl<<endl;

   #if 0
   func_by_value(a, b); // a, b 의 값은 그대로
   #else
   func_by_ref(a, b); // a, b 의 값이 서로 바뀌어 있다.
   #endif
   cout << "after function" << endl;
   cout << "a : " << a << endl;
   cout << " b : " << b << endl << endl << endl;

   return 0;
}
call by reference 를 사용할 경우엔 이렇게 위치를 참조해서 해당 값이 바뀌는걸 볼수 있다.

 

반응형

댓글