Swap Function_call by value, call by address
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언어에서 함수를 호출하는 방식은 두 가지가 있다는 것을 알게 되었다.
- Call by Value : 값에 의한 호출
- 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