Menu
Coddy logo textTech

Void 포인터 복습

Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 49번째.

void*는 C에서 "무언가를 가리키는 포인터이지만, 그것이 무엇인지는 말하지 않겠다"라고 표현하는 방식입니다. 이 포인터는 int, float, 구조체 또는 그 밖의 어떤 데이터 유형의 주소든 저장할 수 있습니다. 따라서 C에서 제네릭 코드를 작성하는 기반이 됩니다.

문제는 void*를 직접 역참조할 수 없다는 것입니다. 컴파일러는 읽어야 할 바이트 수나 해당 바이트를 해석하는 방법을 알지 못합니다. 데이터를 사용하려면 올바른 유형으로 다시 캐스팅해야 합니다.

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

이러한 유연성에는 책임이 따릅니다. 잘못된 유형으로 캐스팅해도 컴파일러는 이를 막아 주지 않지만, 프로그램은 엉뚱한 값을 출력하거나 충돌할 수 있습니다. 그렇기 때문에 제네릭 함수는 종종 void*를 유형 표시자(enum이나 flag 등)와 함께 사용하여, 함수가 데이터를 올바르게 해석하는 방법을 알 수 있도록 합니다.

다음 레슨에서는 void*를 사용하여 모든 유형의 데이터를 저장할 수 있는 컨테이너를 만들고, 진정으로 재사용 가능한 데이터 구조를 구현하게 됩니다.

challenge icon

챌린지

쉬움

print_value라는 함수를 작성하세요. 이 함수는 두 개의 매개변수를 받습니다. 하나는 data를 가리키는 void* pointer이고, 다른 하나는 int type flag입니다. 함수는 type flag에 따라 data를 해석하고 출력해야 합니다.

  • type flag가 0이면 pointer를 int*로 변환하고 정수 값을 출력합니다.
  • type flag가 1이면 pointer를 float*로 변환하고 소수점 이하 2자리까지 float 값을 출력합니다.

프로그램은 두 개의 입력을 받습니다.

  1. type flag (정수인 경우 0, float인 경우 1)
  2. 숫자 값

type flag에 따라 적절한 변수 type에 값을 저장한 다음, 해당 변수에 대한 pointer와 type flag를 사용하여 print_value를 호출하세요.

입력이 042일 때의 출력 예시:

42

입력이 13.14일 때의 출력 예시:

3.14

입력이 0-17일 때의 출력 예시:

-17

입력이 199.5일 때의 출력 예시:

99.50

직접 해보기

#include <stdio.h>

// TODO: 여기에 print_value 함수를 작성하세요


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: int_value에 대한 포인터와 타입 플래그로 print_value를 호출하세요
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: float_value에 대한 포인터와 타입 플래그로 print_value를 호출하세요
        
    }
    
    return 0;
}
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러