STUDY/web

자바 call by value vs call by reference 과제

이앤지 2021. 9. 14. 20:21

오늘의 과제 :

call by value 와 call by reference 는 각각 함수의 호출 방식을 의미한다.

call-by-value (값에 의한 호출)

  • 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (c++의 경우 stack frame) 함수가 종료되면 해당 공간은 사라진다.
  • 스택 프레임(Stack Frame) : 함수 호출시 할당되는 메모리 블록(지역변수의 선언으로 인해 할당되는 메모리 블록)
  • call-by-value 값에 의한 호출방식은 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
  • 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다.
  • 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
  • Java의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (원시자료형 / 참조자료형) 함수 호출 방식이 달라진다.
    • 원시 자료형 (primitive type) : call-by-value 로 동작 (int, short, long, float, double, char, boolean )
    • 참조 자료형 (reference type): call-by-reference 로 동작 (Array, Class Instance)

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

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

 

아래는 자바코드는 아니고 알기쉬운 c++ 예제 코드이다.

#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;
}

 

위 내용은 아래 깃허브블로그에서 참조했는데 정리가 참 잘 돼있다.

https://wayhome25.github.io/cs/2017/04/11/cs-13/

 

강의노트 12. 함수 호출방식(call-by-value, call-by-reference, call-by-assignment) · 초보몽키의 개발공부로그

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

wayhome25.github.io

 

다음 블로그도 자바 학습에 참조하기 좋아서 같이 올려본다.

https://devlog-wjdrbs96.tistory.com/44

 

[JAVA] Call by Value 와 Call by reference 란 ?

C언어를 주로 공부 했던 나는 Call by value 와 Call by reference 에 대해서 call by value 는 값을 넘기는 거고 call by reference 는 포인터를 이용해서 주소를 넘긴다고 알고 있다. 하지만 누군가 나에게 이..

devlog-wjdrbs96.tistory.com