Menu
Coddy logo textTech

고전적인 예제: 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)로는 단순히 처리할 수 없는 작업을 수행하기 위해 포인터가 언제 그리고 왜 필요한지를 보여주는 완벽한 예시가 됩니다.

challenge icon

챌린지

쉬움

포인터를 사용하여 클래식한 swap 함수를 구현하고 시연하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:

  1. 두 개의 정수 포인터를 매개변수로 받는 swap이라는 이름의 함수를 생성합니다.
  2. swap 함수 내부에서 임시 변수를 사용하여 두 포인터가 가리키는 메모리 주소의 값을 서로 교환합니다.
  3. main 함수에서 사용자 입력으로부터 두 개의 정수를 읽습니다.
  4. 원본 값을 Before swap: a = [value], b = [value] 형식으로 출력합니다.
  5. 주소 연산자(address-of operator)를 사용하여 두 변수의 주소를 전달하며 swap 함수를 호출합니다.
  6. 함수 호출 후, 교환된 값을 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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨