티스토리 뷰

언어/C++

[C++] 함수 자료전달

SOo • 2023. 3. 20. 18:34

호출되는 함수에 매개변수가 존재한다면, 함수 호출 때의 값 (argument) 이 호출되는 함수의 매개변수 (parameter)로 전달된다. 자료전달은 1) 값으로 전달 (PassByValue) 2) 참조로 전달(PassByReference) 3) 포인터로 전달(PassByPointer)의 세가지 매커니즘으로 구분한다. 

 

🎀 값으로 전달 : Pass-By-Value 

 

PassByValue 메커니즘 에서는 인수 (argument)의 값이 복사되어 매개변수 (parameter)에 할당된다. 즉, 값을 기반으로 자료가 전달되므로 인수 (argument)는 리터럴 또는 변수의 값이 된다. 

값으로 전달은 호출되는 함수 쪽에서 인수를 변경하지 않게 만들고 싶을 때 사용한다. 왜냐하면 호출되는 함수는 인수의 값을 읽기만 할 수 있다는 것이다. : Read Only Access 라고 불리기도 한다. 


 

🎃 PassByValue 의 예시

#include <iostream>
using namespace std;

// 함수 선언
void fun(int y);

int main()
{
	//변수 선언 
	int x = 10;
	//x를 argument로 fun 함수 호출
	fun(x);
	//x의 값이 변했는지 확인 (변하지 않음)
	cout << "main 함수 내부의 x= " << x << endl;
	return 0;
}

void fun(int y)
{
	y++;
	cout << "fun 함수 내부의 y= " << y << endl;
	return;
}

 

RESULT :

 

 

결과값을 통해 우리는 호출되는 함수 y의 값은 증가했지만 main 함수 x에는 영향이 없음을 확인할 수 있다. 

왜냐하면 fun 함수는 x 값을 전달받고 이를 y에 저장한다. 이때 x와 y는 서로 다른 메모리 위치를 가지기 때문에 fun 함수의 y를 증가시켜도 main 함수의 x에는 영향이 없는 것이다. 

 

PassByValue 매커니즘은 함수 쪽에서 인수를 조작하지 않게 차단한다. 

 

 

🎀 참조로 전달 : Pass-By-Reference 

 

참조로 전달 (PassByReference)에서 인수와 매개변수는 메모리 위치를 공유한다. 컴파일러에게 매개변수를 위한 별도의 메모리 영역을 선언하지 말라고 알려주기 위해, 변수를 새로 선언 (ex) int y) 하지말고 변수를 별칭으로 선언 (int& y) 하게싿고 매개변수에 표기해야한다. 

 


🎃 PassByReferece의 예시 1)

#include <iostream>
using namespace std;

//함수 선언
void fun(int& y); //&기호는 y가 참조라는 것을 나타낸다

int main()
{
	//변수 선언 
	int x = 10;
	//x를 argument로 fun 함수 호출
	fun(x);
	//x의 값이 변했는지 확인
	cout << "main 함수 내부의 x= " << x << endl;
	return 0;
}
void fun(int& y)
{
	y++;
	cout << "fun 함수 내부의 y= " << y << endl;
	return;
}

 

RESULT :

 

 

x와 y는 같은 메모리 위치를 나타내므로 값을 공유한다. 

 


 

🎃 PassByReferece의 예시 2)

 

#include <iostream>
using namespace std;

//함수 선언
void swap(int& first, int& second);

int main()
{
	//선언
	int first = 10;
	int second = 20;
	//함수 호출
	swap(first, second);
	//스왑 확인
	cout << "main 함수의 first 값: " << first << endl;
	cout << "main 함수의 second 값: " << second << endl;
	return 0;
}
void swap(int& fst, int& snd)
{
	int temp = fst;
	fst = snd;
	snd = temp;
	return;
}

RESULT :

 

 

참조로 전달은 호출되는 함수 쪽에서 매개변수를 변경해서 호출한 함수 쪽의 원본 (argument)를 변경할 수 있다. 이 메커니즘은 복사가 필요하지 않다는 장점이 있다. 따라서 큰 객체를 전달할 때는 이 메커니즘을 활용한다. 

 

 

🎀 포인터로 전달: PassByPointer

 

포인터로 전달 메커니즘은 인수로 메모리 주소를 매개변수에 전달하는 것이다. 주소를 전달하므로 매개변수를 사용해서 인수의 메모리 위치에 접근할 수 있다. 인수를 조작하려면 포인터로 전달 메커니즘을 무조건 사용해야한다. 

'언어 > C++' 카테고리의 다른 글

[C++] 메모리 영역 그려보기 _ 1차 퀴즈  (1) 2023.03.20
[C++] 함수 오버로딩  (0) 2023.03.20
[C++] 함수 자료리턴  (0) 2023.03.20
[C++] 주소 입력받기 _ cin.getline() 활용  (0) 2023.03.16
[C++] 프로그램의 개요  (0) 2023.03.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함