Menu
Coddy logo textTech

불투명 포인터 개념

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 17번째.

지금까지 헤더 파일에서 struct를 정의할 때, 해당 헤더를 포함하는 누구든지 모든 멤버를 보고 직접 접근할 수 있었습니다. 이는 외부 코드로부터 내부 세부 정보를 숨기는 원칙인 캡슐화(encapsulation)를 깨뜨립니다.

C는 이를 해결하기 위해 불투명 포인터(opaque pointers)라고 불리는 강력한 기법을 제공합니다. 아이디어는 간단합니다. 헤더에 구조체가 존재한다는 것만 선언하고, 그 내부에 무엇이 들어있는지는 공개하지 않는 것입니다. 이는 불완전한 타입(incomplete type)을 사용하여 수행됩니다:

// wallet.h
typedef struct Wallet Wallet;  // 선언만 포함 - 구현부 없음!

Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);

중괄호가 없다는 점에 유의하세요. Wallet에 무엇이 포함되어 있는지 정의하지 않습니다. 컴파일러는 해당 타입이 존재한다는 것은 알지만, 그 크기나 멤버는 알지 못합니다. 즉, 이 헤더를 포함하는 코드는 Wallet에 대한 포인터로만 작업할 수 있으며, struct 자체를 직접 다룰 수는 없습니다.

이것이 왜 중요할까요? 실제 구조체 정의가 .c 파일 안에 숨겨져 있기 때문에, 여러분의 헤더를 사용하는 그 어떤 코드도 w->balancesizeof(Wallet)을 작성할 수 없습니다. 그들은 여러분이 제공하는 함수를 사용해야만 합니다. 여러분은 데이터에 대한 모든 접근을 제어하며, 여러분의 헤더에 의존하는 코드를 망가뜨리지 않고 나중에 내부 구조를 변경할 수 있습니다.

다음 레슨에서는 소스 파일 내부에서 실제 struct 본체를 정의하여 불투명 포인터 패턴(opaque pointer pattern)을 완성하는 연습을 할 것입니다.

치트 시트

불투명 포인터(opaque pointer)불완전한 타입(incomplete type)을 사용하여 구조체 구현 세부 사항을 숨기고 캡슐화를 강제합니다.

본체를 정의하지 않고 헤더에서 구조체를 선언합니다:

// wallet.h
typedef struct Wallet Wallet;  // 선언만 함 - 중괄호 없음

Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);

컴파일러는 타입이 존재한다는 것은 알지만 그 크기나 멤버는 알지 못합니다. 사용자는 구조체에 대한 포인터로만 작업할 수 있으며, 구조체와 상호작용하려면 제공된 함수를 사용해야 합니다.

실제 구조체 정의는 .c 파일에 위치하며, w->balance와 같은 직접적인 멤버 접근이나 sizeof(Wallet)의 사용을 방지합니다.

직접 해보기

이 레슨에는 코드 챌린지가 없습니다.

quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨