본문 바로가기
C

값에 의한 전달과 주소에 의한 전달

by shinbian11 2020. 2. 16.

값에 의한 전달과 주소에 의한 전달, 말은 어렵지만 쉽게 말해서 이거입니다.

값의 복사본을 넘기는지, 아님 주소를 넘기는지(그래서 그 값 자체에 접근할 수 있는지)


값에 의한 전달 : 함수를 호출할때, 그 값을 복사하여 그 복사본을 함수에 넘기는겁니다.

그러므로 함수에서 그 복사본을 받아 값을 변경하든, 값을 삭제하든 뭔 짓을 하든 간에

원래의 값은 바뀌지 않습니다. 왜냐하면 함수에 전해준 값은 원래의 값이 아니라 원래의 값의 복사본이기 때문입니다.

 

ex) 제가 어떤 사람에게 진단서의 복사본을 주었습니다. 그 사람은 그 복사본에 본인의 서명을 했지만,

본래의 진단서인 저의 진단서에는 그 사람의 서명이 없습니다. 왜냐하면 저는 그 사람에게 복사본을 주었기 때문이죠.


 

주소에 의한 전달: 함수를 호출할때, 그 값의 주소를 전달함으로써, 함수에서 원래의 값에 접근할수있게 합니다.

그러므로 함수에서 그 주소값을 받아 값을 변경하면, 원래의 값도 똑같이 변경됩니다. 반영이 된다는 이야기이죠.

 

ex) 진단서는 현재 파란색 책상위에 있습니다. 파란색 책상위에 있다! 라는 정보(주소)를 그 사람에게 알려주고,

그 사람은 그 주소를 따라가서 파란색 책상위에 있는 진단서에 본인의 서명을 합니다. 그렇게 되면 본래의 진단서에는 그 사람의 서명이 적혀있게 됩니다. 왜냐하면 그것은 복사본이 아니라 진짜 원래의 진단서이니까요.


이것을 코드로 보자면 이런 의미입니다.

 

 

<<값에 의한 참조>>

#include <stdio.h>
void swap(int a, int b);
int main()
{
    int a = 10;
    int b = 20;
    printf("swap 하기전 => a: %d, b:%d\n", a, b);
    swap(a, b);  // 값에 의한 참조
    printf("swap 한 이후 => a: %d, b:%d\n", a, b);
}
void swap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
    printf("swap 내부 => a: %d, b:%d\n", a, b);
}

swap 하기전 => a: 10, b:20

swap 내부 => a: 20, b:10

swap 한 이후 => a: 10, b:20

 

> swap내부에서는 값이 바뀌지만, swap 함수를 호출한 이후엔 다시 원래의 값이 출력됩니다.

다시 원래의 값으로 돌아간게 아니라, 애초에 원래의 값은 swap함수로 전달된게 아니기 때문입니다.

 


<<주소에 의한 참조>>

#include <stdio.h>
 
void swap_addr(int* a, int* b);
 
int main()
{
    int a = 10;    
    int b = 20;
    printf("(주소를 전달)swap 하기전 => a: %d, b:%d\n", a, b);
    swap_addr(&a, &b);  // 값에 의한 참조
    printf("(주소를 전달)swap 한 이후 => a: %d, b:%d\n", a, b);
}
 
void swap_addr(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
    printf("(주소를 전달)swap 내부 => a: %d, b:%d\n", *a, *b);
}

(주소를 전달)swap 하기전 => a: 10, b:20

(주소를 전달)swap 내부 => a: 20, b:10

(주소를 전달)swap 한 이후 => a: 20, b:10

 

함수가 끝나도 값이 유지된다. 그 이유는 값의 주소가 전달되어, 그 값 자체가 변경되었기 때문이다.

 

 


 

감사합니다. 틀린부분있으면 댓글로 알려주세요