프로그래밍 언어에서 Opaque type

Opaque (불투명한) Type 이라는 용어가 종종 프로그래밍 언어 관련 글을 보면 나온다. Opaque type은 데이터(멤버 변수) 조작을 반드시 메소드나 외부 인터페이스로만 할 수 있는 타입을 가리킨다. C++ 같으면 멤버 변수들을 모두 private으로 선언하고 모든 조작을 메소드를 통해서 하는 것으로 opaque type을 구현할 수 있다.

그렇다면 C 에서는?

C에는 struct 밖에 없고 멤버 변수들도 모두 접근이 가능하니 언뜻 보면 힘들어 보인다. 그러나 이런 경우 이 struct에 대한 포인터를 하나의 타입으로 간주해 이것만 노출시키면 완벽하게 opaque type을 만들 수 있다. 가장 좋은 예는 Win32 API에서 매우 자주 등장하는 HANDLE이라는 녀석이다.

HANDLE hThread = CreateThread(…);
HANDLE hFile = CreateFile(…);

이렇게 스레드와 파일을 만들면 모두 공히 HANDLE 이라는 타입이 반환된다. 그리고 이 파일과 스레드에 대한 조작은 오직 관련 API로만 가능하다. 이 HANDLE의 정의는

typedef void *HANDLE;

단순히 이렇게 void* 로 되어있다. 내부에 복잡한 자료구조가 있어도 이렇게 HANDLE과 같은 방식으로 한 번 추상화를 시키면 된다. 아주 간단한 방법이다.

대신 이런 방법은 HANDLE로 가려진 내부자료구조가 대게 API에 의해 동적 할당 되기 때문에 Create*, Init*에 대응되는 Close*, Delete* 와 같은 함수를 호출해야 메모리 릭을 막을 수 있다. 예를 들어, CloseHandle과 같은 함수.

구현은 그냥 이 HANDLE 타입을 받은 뒤, 내부 자료구조로 캐스팅하고 사용하면 된다. 물론 엄한 녀석이 들어올 경우 벌어질 참사를 대비하는 방법도 적절히 필요할 것이다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by object | 2008/10/05 02:42 | 컴퓨터 | 트랙백 | 핑백(2) | 덧글(5)
트랙백 주소 : http://minjang.egloos.com/tb/2084885
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 如是我聞 : 블로그에 글을 쓸.. at 2008/10/05 10:32

... 다. 혹은 고치다가 지우고 새로 올리는 경우가 있다. 문제는 구글 리더가 이런 경우를 모두 저장해 놓는다는 것이다. 옆집에 사시는 object 님의 최신 글 프로그래밍 언어에서 Opaque type이 구글 리더에 어떻게 떴는 지를 보자. 제목을 바꾸신 모양인데 그게 둘다 그대로 잡혔다. 아래글을 클릭하면 없는 포스트로 나오고 윗글은 제대로 연결된 ... more

Linked at art.oriented : C.. at 2008/11/26 14:35

... 나는 이 코드가 매우 “객체지향”적으로 보인다.FILE *를 “FILE 구조체에 대한 포인터”로 생각하지 말고 하나의 ‘객체’로 생각하자. 포인터 읽는 방법이라는 글에서도 썼고 불투명 타입이라는 글에서도 썼지만, 어차피 프로그래머는 FILE 구조체의 내부를 직접 조작하는 일이 없다. 표현이 포인터로 되어 있을 뿐 이건 완벽히 ‘객체’와 그 개념이 같다.fop ... more

Commented by kkamagui at 2008/10/05 20:39
제가 요즘 고민하는 내용과 굉장히 비슷한 내용이라서 한자 적고 갑니다. ^^
윈도우도 제가 고민해서 구현한 것과 비슷하게 동작하는가 보군요. ㅎㅎ
좋은 내용 잘 보고 갑니다. ^^
Commented by 몽몽이 at 2008/10/09 23:54
opaque type은 내부를 알 수 없는 타입이고, "데이터(멤버 변수) 조작을 반드시 메소드나 외부 인터페이스로만 할 수 있는 타입"은 너무 제한적인 기술인것 같습니다. 제가 현재 프로젝트에서 쓰는 모 도구에서 C 언어와 바인딩할 때 opaque type이라는 타입을 제공하기 때문에 좀 찾아봤었는데 그냥 글자 그대로 내부를 알 수 없는 타입 정도가 적당한 의미 같습니다.
Commented by object at 2008/10/15 00:37
네, 그렇게 보는 것이 더 직관적이고 이해하기 좋네요.
Commented by shawn at 2008/10/14 11:42
구조체를 헤더 파일에 forward declaration 해 두고, c 파일에 실제로 선언해 두는 방법도 생각해 볼 수 있을 것 같습니다.
footype.h
... typedef struct footype footype;...
footype.c
... struct footype { uint32_t mFoo; uint32_t mBar; }; sint32_t footypeCreate(footype **fooInst) {...}
이런 식으로요 흐~
Commented by object at 2008/10/15 00:38
footype을 직접 타입으로 사용자가 실수로 쓸 수가 있는 단점이 있어보입니다. 그러면 undefined라는 에러가나겠죠.

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스