고전적인 예제: Swap
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 28번째.
swap 함수는 C 프로그래밍에서 포인터가 왜 필수적인지를 보여주는 가장 유명한 예시 중 하나입니다. 목표는 간단합니다. 두 변수의 값을 서로 바꾸는 함수를 작성하는 것입니다. 하지만, 겉보기에 간단해 보이는 이 작업은 값에 의한 전달(pass-by-value)의 근본적인 한계를 드러냅니다.
일반적인 값에 의한 전달(pass-by-value)을 사용하여 두 변수를 교환하려고 할 때 어떤 일이 일어나는지 생각해 봅시다:
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// 이것은 원본 변수가 아니라 복사본만 교환합니다!
}이 접근 방식은 함수가 값의 복사본만 받기 때문에 실패합니다. 호출하는 함수 내의 원래 변수들은 변경되지 않은 상태로 유지됩니다.
대신 변수에 대한 포인터를 전달하는 방식의 해결책이 필요합니다:
void swap(int *a, int *b) {
int temp = *a; // 주소 a에 있는 값을 저장합니다
*a = *b; // 주소 b에 있는 값을 주소 a에 넣습니다
*b = temp; // 저장된 값을 주소 b에 넣습니다
}변수의 주소를 전달하고 역참조 연산자를 사용함으로써, 함수는 원래 변수의 값을 직접 수정할 수 있습니다. 이는 swap 함수가 값에 의한 전달(pass-by-value)로는 단순히 처리할 수 없는 작업을 수행하기 위해 포인터가 언제 그리고 왜 필요한지를 보여주는 완벽한 예시가 됩니다.
챌린지
쉬움포인터를 사용하여 클래식한 swap 함수를 구현하고 시연하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 두 개의 정수 포인터를 매개변수로 받는
swap이라는 이름의 함수를 생성합니다. swap함수 내부에서 임시 변수를 사용하여 두 포인터가 가리키는 메모리 주소의 값을 서로 교환합니다.main함수에서 사용자 입력으로부터 두 개의 정수를 읽습니다.- 원본 값을
Before swap: a = [value], b = [value]형식으로 출력합니다. - 주소 연산자(address-of operator)를 사용하여 두 변수의 주소를 전달하며
swap함수를 호출합니다. - 함수 호출 후, 교환된 값을
After swap: a = [value], b = [value]형식으로 출력합니다.
출력 결과는 함수가 원래 변수의 값을 성공적으로 교환했음을 보여주어야 합니다:
Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]이 챌린지는 swap 연산에서 포인터가 왜 필수적인지 보여줍니다. 함수가 원래 변수의 값을 영구적으로 교환하려면 해당 변수의 메모리 위치에 접근해야 하며, 이는 값에 의한 전달(pass-by-value) 방식으로는 불가능하기 때문입니다.
치트 시트
swap 함수는 C 언어에서 포인터가 왜 필수적인지 보여줍니다. 값에 의한 전달(Pass-by-value)은 함수가 복사본만 받기 때문에 원래 변수를 바꿀 수 없습니다:
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// 이것은 복사본만 바꿀 뿐, 원래 변수는 바꾸지 않습니다!
}올바른 접근 방식은 포인터를 사용하여 원래 변수에 접근하고 수정하는 것입니다:
void swap(int *a, int *b) {
int temp = *a; // 주소 a에 있는 값을 저장합니다
*a = *b; // 주소 b의 값을 주소 a에 넣습니다
*b = temp; // 저장된 값을 주소 b에 넣습니다
}주소를 전달하고 역참조 연산자(*)를 사용함으로써, 함수는 원래 변수의 값을 직접 수정할 수 있습니다.
직접 해보기
#include <stdio.h>
// TODO: 여기에 swap 함수를 작성하세요
int main() {
int a, b;
// 입력 읽기
scanf("%d", &a);
scanf("%d", &b);
// 원래 값 출력
printf("Before swap: a = %d, b = %d\n", a, b);
// TODO: 여기에 swap 함수를 호출하세요
// 바뀐 값 출력
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.