[C++] Call-By-Value, Call-By-Reference 예제

[C++] Call-By-Value, Call-By-Reference  예제


이번 포스팅에서는 함수의 호출 방법인 Call-By-Value와 Call-By-Reference에 관한 간단한 예제를 통하여 이해를 돕도록 하겠습니다.


Call-By-Value?, Call-By-Reference? C언어 또는 C++ 언어를 공부하신 분들은 한번씩은 들어 보셨을 거라고 생각됩니다.


간단히 설명을 드리면


Call-By-Value : 값에 의한 호출로써, 말 그래도 값을 복사하는 것을 나타냅니다.

Call-By-Reference : 참조의 의한 호출로써, 값을 전달하는 것이 아닌 해당 값이 저장되어 있는 주소값을 전달하는 것을 나타내는 것으로 쉽게 이해를 하시면 되겠습니다.


그럼 실제 코드를 보시면서 어떤 차이가 있는지에 대해서 살펴 보도록 하겠습니다.


[ Call-By-Value 예제]

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

#include <iostream>

 

using namespace std;

 

void swap(int x, int y)

{

    int temp = x;

    x = y;

    y = temp;

}

int main(void)

{

    int a = 1;

    int b = 2;

    swap(a, b);

 

    cout <<"a : "<< a << endl;

    cout <<"b : " <<<< endl;

 

    system("pause");

 

    return 0;

}

 

 

cs

 


[실행 결과]


위와 같이 보시게 되면 a의 값과 b의 값이 서로 바뀌어서 출력이 될 줄 알았지만 실제 실행결과를 보시게 되면 바뀌지 않고 각각 a:1, b:2 가 출력되는 것을 확인하실 수 있습니다.


그렇다면 왜 이렇게 출력이 되었을까? 아래 그림을 보시면서 설명 드리겠습니다.




현재 a의 값은 1이고, b의 값은 2를 저장하고 있습니다. 그리고 swap함수를 호출하여 각각 x, y의 매개변수 값으로 a, b의 값을 넘겨 주고 있고 x변수에 저장되어 있는 값을 temp변수에 먼저 저장을 시켜 줍니다. 그러면 현재 temp변수에는 1이라는 값이 저장되어 있는 것입니다.


두 번째로 y의 값 2를 x의 변수에 저장하였고, 마지막으로 temp에 저장되어 있는 값 1을 y 변수에 저장한 것을 확인하실 수 있습니다.

그러면 x : 2, y : 1, temp : 1을 각각 저장하고 있게 되는 것입니다.


그렇지만 현재 main함수 안에 지역변수로 선언되어 있는 a, b의 값은 변하지 않은 것을 확인하실 수 있습니다. 


때문에 a : 1, b : 2가 그대로 출력되는 것입니다.


바로 이것이 값에 의한 호출인  Call-By-Value입니다.




다음으로 Call-By-Reference 호출 예제를 살펴 보도록 하겠습니다.


[Call-By-Reference 예제]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include <iostream>

 

using namespace std;

 

void swap(int *x, int *y)

{

    int temp = *x;

    *= *y;

    *= temp;

}

int main(void)

{

    int a = 1;

    int b = 2;

 

    swap(&a, &b);

 

    cout <<"a : "<< a << endl;

    cout <<"b : " <<<< endl;

 

    system("pause");

 

    return 0;

}

cs

 


[실행 결과 화면]


이렇게 a,b의 값이 제대로 바뀐 것을 확인하실 수 있습니다.


위의 코드설명을 아래 그림을 통해 쉽게 이해하실 수 있게 설명 드리도록 하겠습니다.



이렇게 현재 a라는 변수에는 1이라는 값이 저장 되어 있었고, a의 주소는 0x123이라고 가정합니다.


또한, b라는 변수에는 2라는 값이 저장되어 있으면서 현재 b의 주소는 0x124라고 가정합니다.


그리고 swap함수가 호출되면서 매개변수로 a, b의 각각 값이 저장되어 있는 주소값을 넘기게 됩니다. 

그리고 int temp 변수 안에 x의 주소값이 가리키고 있는 값 즉, a 변수가 저장하고 있는 1이라는 값을 temp 변수에 저장을 시킵니다.


다음으로 y의 주소값이 가리키고 있는 값, 즉 b 변수가 저장하고 있는 2라는 값을 x가 가리키고 있는 주소에 저장을 시킵니다.


마지막으로 temp 변수가 저장하고 있는 1이라는 값을 y 변수가 저장하고 있는 주소값이 가키리는 곳에 가서 현재 값을 1로 바꾸어 저장을 시켜 줍니다.


이로써 현재 a와 x의 주소는 같고 x가 저장하고 있는 주소값이 가리키는 메모리의 값은 2가 되었고, b가 가리키는 주소값의 값은 y가 가리키고 있는 주소값의 값이랑 같기 때문에 1이 되었습니다.


바로 이것이 Call-By-Reference 참조에 의한 호출입니다.



천천히 그림을 보시면서 쉽게 이해하실 수 있을거라고 생각합니다.


감사합니다.^^

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY