23년 C++ chap6 함수 -> 자료교환
04 자료 교환
1 자료 전달
-자료 전달은 값으로 전달, 참조로 전달, 포인터로 전달의 3가지 메커니즘으로 구분
(1) 값으로 전달
-인수의 값이 복사되어 매개변수에 할당된다
-호출 함수 쪽에서 인수를 변경하지 않게 만들고 싶을 때 사용
-즉, 호출 함수는 인수의 값을 읽기만 할 수 있다(읽기 전용 접근)
#include <iostream>
using namespace std;
void fun(int y);
int main()
{
// 선언
int x = 10;
fun(x); // 호출
cout << "main 내부 x = " << x << endl;
return 0;
}
void fun(int y){
y++;
cout << "fun 내부 y = " << y << endl;
return;
}
-> 호출되는 함수에서 매개변수인 y 값을 증가시켜도, 인수 x는 증가하지 않는다
(2) 참조로 전달
-인수와 매개변수가 메모리 위치를 공유
ex) 밑의 자료에서 x와 y는 메모리 위치를 공유 -> y를 위한 메모리 공간이 추가 할당되지 않음
int main(){
int x = 10;
fun(x);
...
}
void fun(int& y){
...
}
-> 컴파일러에게 매개변수 y를 위한 별도의 메모리영역 선언하지 말라고 알리기 위해 변수를 별칭으로 선언(int& y)하겠다고 표기해야 함
(2)-1 *추가적인 변수를 사용해 두 변수 스왑하기
-참조로 전달을 살펴보는 고정적인 예시로 스왑이 있다
#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;
return 0;
}
void swap(int& fst, int& snd){
int temp = fst;
fst = snd;
snd = temp;
return;
}
(3) 포인터로 전달
-인수로 메모리 주소를 매개변수에 전달하는 것
-주소를 전달하므로 매개변수를 사용해서 인수의 메모리 위치에 접근 가능
2 자료리턴
-void 함수는 부가 작용을 위해 사용 -> return 값 x
ㄴ> void 함수가 아니면 값을 return해야 함
-리턴은 값의 종류에 따라 값으로 리턴, 참조로 리턴, 포인터로 리턴의 3가지 메커니즘으로 구분
(1) 값으로 리턴
-호출되는 함수 쪽에서 어떤 표현식을 생성, 이를 리턴
-값을 복사해서 리턴
(2) 참조로 리턴
-복사로 인해 발생하는 비용을 줄이기 위해 사용
-다만, 호출되는 함수에서 객체 생성하면 함수 종료 이후 객체가 사라짐
ㄴ> 여러 주의 사항은 추후 살펴볼 예정
(3) 포인터로 리턴
-거의 사용 x