2023 c++

23년 C++ chap6 함수 -> 자료교환

gy8879 2023. 7. 19. 12:18

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