Open-Closed Principle

[c언어]값에 의한 호출 대 참조에 의한 호출 (call by value vs call by reference) 본문

Programming/C, C++

[c언어]값에 의한 호출 대 참조에 의한 호출 (call by value vs call by reference)

대박플머 2016. 1. 26. 18:00

함수에 인자를 넘기는 방식에는 두가지가 있다 .

첫째, 값에 의한 호출(call by value)

둘째, 참조에 의한 호출(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
25
26
27
28
29
30
31
32
#include <stdio.h>
 
void SwapValue(int a, int b) // 1
{
    int temp = 0;
    
    temp = a;
    a = b;
    b = temp;    
}
 
void SwapReference(int* a, int* b) // 2
{
    int temp = 0;
    temp = *a;
    *= *b;
    *= temp;
}
 
void main(void)
{
    int a = 1;
    int b = 2;
    
    SwapValue(a,b);
    printf("SwapValue => a : %d, b : %d", a, b); // 3
    // 초기화
    a = 1;
    b = 2;
    SwapReference(&a,&b);    
    printf("SwapReference => a : %d, b : %d", a, b); //4   
}
cs

 1, 2번 함수의 인자를 넘기는 형식이 다른다. 

1번은 변수 값을 넘기고 2번은 주소값을 넘긴다. 

2번의 변수 넘기는 형태을 유심히 볼 필요가 있다.(잠깐 각설을 하겠다.)

1
2
3
4
5
// 보통 포인터를 선언할때 
int *vptr;
 
// 2번과 같은 경우는 
int* vptr;
cs

포인터 연산자의 위치가 변수명에 붙어 있느냐 데이터 타입에 붙어 있느냐에 따라 이해하기 어렵울 수도 쉬울 수도 있다. 

나의 생각은 우선 데이터 타입쪽에 붙어 있어야 한다고 생각한다. 이유인 즉슨 포인터는 데이터 타입이기 때문이다. 

엄밀하게 이야기 하면 꼭 그렇다고 이야기 할 수는 없지만 만약 배우는 단계라면 포인터는 데이터 타입이라고 생각하는게 

포인터를 이해하는데 아주 좋은 방법이 될 수도 있다.

각설하고,  

1번과 2번의 차이점은 넘기는 형식이 다를 뿐 실제로 값이 복사 되는 것은 똑같다. 

1번은 값이 복사되는 것이고, 2번은 주소가 복사되는 것이다. 

그런데 2번의 경우 주소가 복사 되기 때문에 포인터 연산자를 이용하여 주소 내부의 값을 Swap할 수 있었던 것이다. 

값의 의한 호출(call by value)과 참조에 의한 호출(call by reference)이라는 말은 주소를 호출할 것이냐 아니면 값을 호출 할 것이냐 이다. 

쓰임새를 생각해보면 쉽게 이해할 수 있을 것 같다. 

원본을 수정할 경우 ==> 주소 

원본 보존 ==> 값 



'Programming > C, C++' 카테고리의 다른 글

[c언어] void 포인터  (0) 2016.01.26
[C언어] 2차원 배열과 포인터  (0) 2014.07.06
[C언어] 1차원 배열과 포인터  (0) 2014.06.29
[C언어]포인터의 기초(pointer)  (0) 2014.06.26