COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가?
본 게시물은 ‘codeproject.com’에 게시된 글 ‘Introduction to COM - What It Is and How to Use It.’을 번역한 것입니다.
원 게시물은 https://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It에 게재되어 있습니다. 최대한 원문에 적힌 의도를 반영하고자 하였으나, 우리말로 읽었을 때 보다 자연스럽게 하고자 부득이 어순과 어휘를 조정한 부분도 있음을 양해 바랍니다.
또한 본 게시물에서 언급하고 있는 예제 소스 코드는 Visual C++ 6.0을 기준으로 작성되어 있기 때문에 후속 버전의 Visual Studio(또는 Visual Studio .NET)에서 자동 생성되는 COM 코드와는 다소 차이가 있음을 감안하고 읽으시기 바랍니다.
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (1)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (2)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (3)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (4)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (5)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (6)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (7)
- COM의 소개(파트 1) – COM이 무엇이며, 어떻게 사용하는가? (8) [完]
기본 요소들의 정의
보다 구체적으로 살펴봅시다. ‘인터페이스(interface)’는 쉽게 말하면 함수들의 집합입니다. 또한 인터페이스에 속한 함수들을 ‘메소드(method)’라고 부릅니다. 인터페이스 이름은 대문자 ‘I
’로 시작하는데, 예를 들어 IShellLink
가 있습니다. C++에서 인터페이스는 순수 가상함수들만을 포함하는 추상 클래스로서 작성됩니다.
인터페이스는 다른 인터페이스에서 상속할 수 있습니다. 상속은 C++의 단일상속과 비슷하게 작동합니다. 인터페이스에서 다중상속은 허용되지 않습니다.
‘coclass(component object class의 약어)’는 DLL 또는 EXE 등에 포함되어 있습니다. 또한 하나 이상의 인터페이스에 대한 코드 비하인드(code behind)를 가지고 있습니다. 때문에 ‘coclass’는 이러한 인터페이스를 “구현한다(implement)”고도 부릅니다. ‘COM 객체(COM object)’는 메모리에서 ‘coclass’의 인스턴스입니다. 종종 COM 클래스의 구현체가 C++ 클래스이기는 하지만, COM 클래스가 C++의 클래스와 같지 않음을 숙지하시기 바랍니다.
‘COM 서버(COM server)’는 하나 이상의 ‘coclass’를 포함하고 있는 DLL, ELE 등의 바이너리입니다.
‘등록(registration)’은 Windows 운영체제에서 COM 서버의 위치를 알려주는 레지스트리 진입점을 생성하는 과정입니다.
‘등록 해제(unregistration)’는 그 반대로서, 레지스트리 진입점을 제거합니다.
‘GUID(glocal unique identifier의 약어)’는 128비트 숫자입니다. GUID
는 COM이 대상을 식별하기 위한 언어 독립적인 방법입니다. 각각의 인터페이스와 ‘coclass’는 GUID
를 갖습니다. 독자 여러분이 GUID
를 생성할 때 COM API를 사용하는 한, GUID
는 전세계에서 유일하기 때문에 이름 충돌을 회피할 수 있습니다. 또한 독자 여러분은 ‘UUID(universally unique identifier의 약어)’라는 용어도 접할 수 있는데, 일반적으로 UUID
와 GUID
는 같습니다.
‘클래스 ID, 또는 ‘CLSID’는 ‘coclass’를 지명하는 GUID
입니다. 인터페이스 ID, 또는 ‘IID’는 인터이스를 지명하는 GUID
입니다.
COM에서 GUID를 적극적으로 사용하는 이유는 다음과 같이 두 가지로 정리할 수 있습니다.
1. GUID는 내부적으로 숫자에 불과합니다. 따라서 어떤 프로그래밍 언어라도 이를 다룰 수 있습니다.
2. 누가 어떤 장치로 GUID
를 생성하든, 모든 GUID
는 적절하게 생성되기만 한다면 유일합니다. 그러므로 COM 개발자들은 서로 같지 않은 유일한 GUID
를 얻을 수 있습니다. 이는 GUID
를 발급하는 중앙 기관이 필요하지 않게 합니다.
‘HRESULT
’는 COM이 오류 또는 성공 코드를 반환하기 위해 사용되는 통합된 자료형입니다. 자료형 명칭에 ‘H
’ 접두어가 있지만, 어떤 대상과 관계된 ‘핸들’이 아닙니다. 이후에 HRESULT
와 이를 어떻게 사용하는지에 대해 충분히 설명하겠습니다.
‘COM 라이브러리(COM library)’는 COM 관련 작업을 수행할 때 독자 여러분이 상호작용하는 운영체제의 일부입니다. 종종 COM 라이브러리를 줄여서 COM이라 부르기도 하지만, 여기에서는 혼동을 피하기 위해 COM 라이브러리라고만 부르겠습니다.