오늘은 메모리에 이미 저장된 값을 교환할 때 어떤 방식으로 교환해야 하는지에 대해 공부해보도록 하겠습니다.
가장 먼저 swap이라는 함수를 따로 만들어서 입력받은 정수 a, b를 교환하는 작업을 해보도록 하겠습니다.
#include <stdio.h>
void swap(int a, int b);
int main(void)
{
int x = 1;
int y = 2;
printf("x 는 %i, y 는 %i\n", x, y);
swap(x, y);
printf("x 는 %i, y 는 %i\n", x, y);
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
위의 코드처럼 x, y에 각각 정수를 입력하고 swap 함수를 사용해 바꿔봤습니다.
결과가 어떻게 나올까요??
분명히 컴파일도 에러없이 잘 되고 함수에 문제가 있는 것도 아닌데 x, y가 바뀌지 않았습니다. 왜일까요?
그 이유는 swap함수가 교환하는 x, y 자체의 값이 아닌 함수에 새로 정의된 a, b를 바꿔줬기 때문입니다. 이 a, b는 x와 y의 복제된 값(즉 다른 메모리 주소를 가지는)을 가지고 있기 때문에 바뀌지 않은 상태로 출력되는 것입니다.
실제로 메모리 안에는 데이터가 저장되는 구역이 나눠져 있습니다.
machine code 영역에는 프로그램이 실행될 때 컴파일된 바이너리가 저장되고,
global 영역에는 프로그램 안에서 저장된 전역 변수,
heap 영역에는 malloc으로 할당된 메모리의 데이터가 저장되고,
stack 영역에는 프로그램 내의 함수와 관련된 것들이 저장됩니다.
이를 생각해본다면 위 코드의 a, b, x, y, tmp 모두 stack영역에 저장되지만 a, b는 x, y와 다른 위치에 저장되어있기 때문에 a, b를 바꾸더라도 x, y는 바뀌지 않는 겁니다.
그럼 어떻게 해야 x, y의 값 교환이 가능해질까요?
간단하게 포인터를 이용해주면 됩니다. 포인터를 사용하면
이런 식으로 a, b가 실제 x, y를 가리키기 때문에 a, b를 바꿔주면 x, y도 바뀌게 됩니다.
#include <stdio.h>
void swap(int *a, int *b);
int main(void)
{
int x = 1;
int y = 2;
printf("x 는 %i, y 는 %i\n", x, y);
swap(&x, &y);
printf("x 는 %i, y 는 %i\n", x, y);
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
잘 바뀌어서 출력되는 것을 확인할 수 있습니다.
출처
본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)
강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.
'CS 기초 > 메모리' 카테고리의 다른 글
[CS50] 파일 읽기 (0) | 2021.08.26 |
---|---|
[CS50] 파일 쓰기 (0) | 2021.08.25 |
[CS50] 문자열 복사 (0) | 2021.08.22 |
[CS50] 문자열 비교 (0) | 2021.08.21 |
[CS50] 문자열 (0) | 2021.08.20 |