Call By Value, Call By Reference

Ouroboros·2023년 9월 14일
0

개발상식

목록 보기
9/17
post-thumbnail

✨Method를 호출 할 때 파라미터를 전달하는 2가지 방법

Call By Value <값에 의한 호출>

  • Method를 호출할 때 파라미터에 값을 복사해서 넘겨준다.

  • 복사된 인자 값은 함수 안에서만 사용되는 Local Value의 특성을 가지고 있다.

  • Method 안에서 인자 값이 변해도 외부의 변수 값은 변하지 않는다.

  • 장점 : 복사하여 처리하기 때문에 외부의 변수 값이 안전하다. 원래의 값 보존
    단점 : 복사를 하기 때문에 메모리 사용량이 늘어난다.

  • 코드예시

#include <iostream>
using namespace std;
 
void Swap(int x, int y)
{
//3. Method 내부의 값 변경
	int tmp = x;
	x = y;
	y = tmp;
}
 
int main()
{
//1. main 에서 변수 선언
	int a = 100;
	int b = 777;

//2. Method 호출
	Swap(a, b);
 
	cout << "a : " << a << endl;
	cout << "b : " << b << endl;
}
✔️ 최초 프로그램이 실행되면, 메모리의 Stack 영역에 위 변수가 할당된다.

[메모리 구조에 관한 링크❣️]

✔️ Swap() 함수가 호출되면 main의 값인 a=100, b=777이 Swap() a, b로 각각 넘어간다.
Stack 내부에 main() 과 Swap()이라는 영역이 나뉘어지게 된다.

✔️ Swap() 함수 내부에서는 변수 a↔b 값을 서로 치환하게 된다.
여기서 중요한 것은 치환된 변수들이 swap() 함수 내부의 지역 변수이며,
이는 main() 함수 내의 지역변수에 아무런 영항을 미치지 않는다❗

Call By Reference <참조에 의한 호출>

  • Method를 호출할 때 파라미터에 주소값을 넘겨준다.
  • Method 안에서 인자 값이 변하면 외부의 변수 값도 변한다.
  • 왜냐하면 주소값을 통해 원본에 접근할 수 있기 때문이다.
  • 장점 : 직접 주소값을 넣어 참조하기 때문에 빠르다.
    단점 : 원래 값에 영향을 준다.
  • 코드예시

#include <iostream>
 
using namespace std;
 
void Swap(int *a, int *b)
{
//3. Method 내부의 값 변경
	int tmp = *a;
  //①
	*a = *b;
  //②
	*b = tmp;
}
 
int main()
{
//1. main 에서 변수 선언
	int a = 100;
	int b = 777;
  
//2.Method 호출 
//***main a,b값의 주소값 넘김
	Swap(&a, &b);
 
	cout << "a : " << a << endl;
	cout << "b : " << b << endl;
}
✔️ 메모리의 Stack 영역에 위 변수가 할당된다.

✔️ Swap() 함수가 호출되면 Stack 내부에 main() 과 Swap()이라는 영역이 나뉘어지게 된다.
swap() 함수가 호출되면, 다음과 같이 swap() 함수의 포인터 변수 a, b에 mains()의 주소값들이 대입된다.

✔️ Swap() 함수 내의 변수들은 포인터 변수이다.
Swap() 함수에서는 해당 포인터 변수의 주소를 참조하여, main()함수의 a, b 값을 바꾸게 된다.
즉, 실질적으로는 참조된 주소값인 main() 함수의 a, b 값을 변경한다.

참고자료
1) https://programist.tistory.com/entry/C-%EC%96%B8%EC%96%B4-Call-by-Value%EA%B0%92%EC%97%90-%EC%9D%98%ED%95%9C-%ED%98%B8%EC%B6%9C-Call-by-Reference%EC%B0%B8%EC%A1%B0%EC%97%90-%EC%9D%98%ED%95%9C-%ED%98%B8%EC%B6%9C%EC%9D%98-%EC%9D%B4%ED%95%B4
2) https://bcp0109.tistory.com/360
3) https://kangworld.tistory.com/64

0개의 댓글