Language/C

Swap Function_call by value, call by address

현식 :) 2020. 4. 1. 19:27

Swap Function

Quick Sort 공부를 하던 도중, 배열에 있는 값을 Swap 하고 싶어 이번 포스트에 대해 공부하여 보았다.

다음 변수 a와 b의 값을 스왑하기 위해 아래와 같은 코드를 이용해왔었다.

int a = 10;        // 변수 a 선언 및 10 대입
int b = 20;        // 변수 b 선언 및 20 대입
int temp;          // 변수 temp 선언. Swap을 위해 다른 변수의 값을 임시 저장하는 용도.

temp = a;          // temp 에 a 대입. temp = 10
a = b;             // a 에 b 대입. a = 20
b = temp;          // b 에 temp 대입. b = 10

이제 막 Function을 선언 및 호출하여 쓰는 재미가 생겨 배열 내 값을 Swap하는 Function 을 만들어보던 중 어려움을 겪었다.

그러던 도중, C언어에서 함수를 호출하는 방식은 두 가지가 있다는 것을 알게 되었다.

 

  1. Call by Value : 값에 의한 호출
  2. Call by Address : 주소에 의한 호출

이제부터 이 두가지 호출 방식에 따른 Swap Function 을 만드는 법을 알아보도록 하겠다.

1. Call by Value

첫 번재, 값에 의한 호출이다.

변수나 상수의 값을 인자로 함수를 호출한다.

인자 Ex) 10, 20, a, b, array[0], array[1] ...

아래와 같이 값에 의한 호출 방식으로 Swap function 을 만들어 보았다.

#include <stdio.h>

void swap (int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
    // 2. 함수 실행 후
}
void main()
{
    int a = 10, b = 20;
    // 1. 함수 호출 전
    swap(a, b);
    // 3. 함수 호출 후
}
// 주석은 아래 결과에서 참고할 예정이다.

위 코드를 실행 후, 변수 a와 b의 값을 출력하면 어떤 값이 나오게 될까?

아직 공부할 게 산더미 같은 필자는..

당연히 a는 20이고, b는 10이지~ 라고 생각해버렸지 모얌~

결과는 a는 10, b는 20을 그대로 가지고 있었다. 그 이유를 알아보겠다

필자의 노트북에서 실행한 결과이니 주소값은 다르게 나올 수도 있음을 참고바란다 :D

1. 함수 호출 전
변수 a의 값 : 10
변수 b의 값 : 20
변수 a의 주소값 : 2665793080
변수 b의 주소값 : 2665793084

2. 함수 실행 후
변수 a의 값 : 20
변수 b의 값 : 10
변수 a의 주소값 : __2665793036__
변수 b의 주소값 : __2665793032__

3. 함수 호출 후
변수 a의 값 : 10
변수 b의 값 : 20
변수 a의 주소값 : 2665793080
변수 b의 주소값 : 2665793084

아니! 함수 내에서만 값이 Swap되다니!

자세히 보면 swap 함수 내부main 문 내부에서 각 변수의 주소값이 다르다는 걸 알 수 있다.

함수 내부에서는 함수 내부에서 정의된 매개변수끼리 swap이 일어나는 것이었다.

하지만 main 으로 돌아오게 되며 이 값이 반영이 되지 않는 것이다.

다시 말해 main 문과 swap 함수 내부의 변수 a, b는 다른 것이었다.따흐흑...

그럼 어떻게 해야 swap 함수를 만들 수 있는 것일까

아래에서 만들어 보도록 하자 :D

2. Call by Address

두 번째, 주소에 의한 호출이다.

Call by Value는 인자로 값을 받았다.

하지만 이번엔 주소값을 인자로 받을 것이다.

인자 Ex) &a, &b, &arr[0], &arr[1] ...

아.. 벌써부터 무진장 어렵다.

하지만 이번 고비를 넘기면 SW 꿈나무에 좋은 비료가 될 것이다 하하

주소에 의한 호출 방식으로 Swap function을 만들어 보겠다.

#include <stdio.h>

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
    //2. 함수 실행 후
}
void main()
{
    int a = 10, b = 20;
    //1. 함수 호출 전
    swap(&a, &b);
    //3. 함수 호출 후
}
//주석은 아래 결과에서 참고할 예정이다

주소를 인자로 받아 호출한 함수의 결과는 어떻게 될까?

당연히 swap이 제대로 일어났으니 이런 글을 적었을 것이다.

그렇다면 아래 결과를 통해 도대체, , 무엇 때문에 주소에 의한 호출이 제대로 동작하는지 알아보자

필자의 노트북에서 실행한 결과이니 주소값은 다르게 나올 수도 있음을 참고바란다 :D

1. 함수 호출 전
변수 a의 값 : 10
변수 b의 값 : 20
변수 a의 주소값 : 532238824
변수 b의 주소값 : 532238828

2. 함수 실행 후
변수 a의 값 : __533238824__
변수 b의 값 : __533238828__
변수 a의 주소값 : 532238776
변수 b의 주소값 : 532238768
* a에 접근한 값 : 20
* b에 접근한 값 : 10

3. 함수 호출 후
변수 a의 값 : 20
변수 b의 값 : 10
변수 a의 주소값 : 532238824
변수 b의 주소값 : 532238828

아아... 보이는가... Swap function 내부의 결과가 !!

Swap function 내부 변수 a 와 b 의 값을 보니 main 함수 내부 변수 a 와 b의 주소값과 같지 않은가!

그렇다.. 주소에 의한 호출은 값을 바꾸는 것이 아니라 주소를 바꾸는 것이다.

물론 주소 내에 있는 값도 함께 바뀌는 것!

주소값인 *a 와 *b 에 접근해 봄으로써, 주소가 바뀌며 주소 내부 값도 따라 바뀌었음을 알 수 있다.

참고로 필자는 배열의 값을 Swap하고 싶었으므로, &array[n] 형태의 배열 주소를 인자로 받아서 활용하였다.

 

 

이로써 SW 꿈나무는 Swap Function을 만들어 쓸 수 있게 되버리고 말았다. 끝 :D