임시공간 할당(call by referrence)에 의한 SWAP함수 알고리즘 설명

2010. 3. 1. 17:34STUDY !/잡다한 지식


 일단 무슨 알고리즘이든, 포인터가 들어간 알고리즘은 머리를 복잡하게 만드는것이 일반적입니다.
 SWAP알고리즘 또한 함수로 구현하게 되면, call by referrence 에 의한 값의 이동이 일어나기 때문에 쉽사리 머리로 이해하기가 쉽지 않습니다. (call by referrence는 포인터를 필연적으로 사용하게 됨)
 이번에는 이 임시공간 할당에 의한 SWAP알고리즘에 대해서 이해해 보도록 합시다.


 값 전달( call by referrence )은 값을 복사해서 함수로 전달하기 때문에, 바꾸고자 하는 값을 변경할 수 없습니다. 포인터를 이용하면 값을 넘겨받지 않고, 값이 저장되어 있는 주소를 인자로 넘겨받아 해당 주소를 직접 참조하여 값을 변경시킬 수 있습니다.

 예를 들어서, A와 B라는 공간에 저장된 1이라는 값과 2라는 값이 있습니다.

 이 값을 그냥 call by value로 함수에 전달하게 되면 1과 2라는 값이 C와 D라는 공간에 복사되어 함수로 넘겨지고, 함수에서 연산이 이루어 진 뒤, C와 D의 값만 변화되고, 함수가 종료되면  C와 D라는 저장공간은 사라지게 되므로 아무런 변화도 일어나지 않습니다. 즉  ( m : n 을 변수 m에 저장된 값 n이라고 할때)  A : 1,  B : 2,  C : 1,  D : 2가 되므로 원래 값과 함수에서 처리한 값 사이에는 아무런 관계가 없는 것으로 나타납니다.

 반면에, 이 값을 call by referrence로 전달하게 되면, 1과 2가 저장되어 있는 공간의 주소 값인 A와 B가 새로운 공간 C와 D에 저장됩니다. 즉 C : A,  A : 1 , D : B, B : 1이 됩니다.
 따라서 여기에서 역참조 연산자(*)를 사용하여 C값을 참조하게 되면, C의 값인 A를 따라 우리가 변화 시키고 싶어 했던 1이라는 원본 값에 도달하게 됩니다.

SWAP함수를 작성하는 1단계는 함수를 정의하는 것 입니다. 
 1. 반환하는 값이 없습니다.
 2. 넘겨받는 값은 주소입니다.

 1번은 함수의 반환형을 암시하고, 2번은 매개변수의 자료형을 암시합니다.
 위의 명세에서와 같이 반환형은 void형이됩니다. 자료형은... 잠시 혼란이 오실 수 있겠네요. 일반적으로 C언어에서 주소값을 저장할 때에는 포인터를 이용합니다. 또, int형 자료를 저장하는 주소를 가르켜야하기 때문에 int* 형이 되어야 겠죠. 따라서 매개변수의 자료형은 int*형이 됩니다.

>
void swap(int* x, int* y);

 이번엔 구현부분을 살펴봅시다.
 주소 값을 넘겨받았기 때문에 값을 참조할 때는 역참조연산자(*)를 사용합니다. 일단, 한 값을 임시 저장할 변수를 생성합니다. 주소 값을 저장하게되므로 자료형은 int* 형이됩니다. ( int* temp; )
 이번에는 연산을 수행합니다.

>
int* temp;
*temp = *x;
*x = *y;
*y = *temp;
 이제 함수 호출 부분을 봅니다.
함수를 호출할 때 매개변수로 주소값을 넘겨주어야 하기 때문에, 주소연산자(&)를 사용합니다.(주소 연산자는 변수의 주소 값을 리턴합니다.)
>
swap(&a, &b);


 
 이렇게 하여 주소값전달에 의한 swap알고리즘에 대해 알아보았습니다.
 처음 생각할 때는 어렵지만, 한번 이해하고나면 간단한 문제 입니다.
반응형

'STUDY ! > 잡다한 지식' 카테고리의 다른 글

샵메일(#mail)? 이게 뭐지?.Araboza  (0) 2018.01.30
SWAP 알고리즘  (0) 2010.02.27
선택정렬 알고리즘  (0) 2010.02.27
[C] ' ' , " "  (0) 2009.10.18
AMD CPU에서 Matlab 실행시키려면 ?  (0) 2009.09.12