IUnknown

컴퓨터 프로그래밍을 통해 마이크로소프트 윈도우의 애플리케이션에서 윈도우 API를 사용하면, IUnknown 인터페이스는 컴포넌트 오브젝트 모델(COM)의 근본적인 인터페이스이다. COM 사양은 COM 객체가 이 인터페이스를 구현해야 한다고 규정한다. 더욱이 다른 모든 COM 인터페이스는 IUnknown에서 파생되어야 한다. IUnknown은 모든 COM 객체의 두 가지 필수 기능을 노출한다: 참조 횟수 계산 방식을 통한 객체 수명 관리, 그리고 다른 인터페이스를 통한 객체 기능 접근이다.
IUnknown은 마이크로소프트의 COM 및 DCOM 객체 모델의 기초적인 부분일 뿐만 아니라, 다른 플랫폼에서도 동일한 인터페이스의 구현체가 존재한다. 이는 다른 플랫폼이 어떤 형태의 COM 호환성을 구현하거나, 설계가 효과적이라고 판단되었기 때문이다.

IUnknown (또는 IUnknown에서 파생된) 인터페이스는 일반적으로 인터페이스에 선언된 함수를 구현하는 함수에 대한 포인터 목록을 인터페이스에 선언된 순서대로 포함하는 가상 메소드 테이블에 대한 포인터로 구성된다. 따라서 인프로세스 호출 오버헤드는 C++의 가상 메소드 호출과 동일하다.

 메소드 
IUnknown 인터페이스는 세 가지 메소드를 노출한다: QueryInterface, AddRef, 그리고 Release이다.IUnknown definition at microsoft.com ; accessed 18-Jan-2008
 QueryInterface는 호출자가 컴포넌트가 구현하는 인터페이스에 대한 참조를 검색할 수 있도록 한다. 이것은 C++의 dynamic_cast<> 또는 자바 및 C 샤프의 형 변환과 유사하다. 특히, 이 인터페이스를 고유하게 식별하는 GUID (일반적으로 인터페이스 ID 또는 IID로 알려짐)가 주어졌을 때, 다른 인터페이스에 대한 포인터를 얻는 데 사용된다. COM 객체가 해당 인터페이스를 구현하지 않으면 대신 E_NOINTERFACE 오류가 반환된다.
 AddRef는 새로운 클라이언트가 객체를 획득할 때 참조 횟수를 증가시키는 데 사용된다. 새로운 참조 횟수를 반환한다.
 Release는 클라이언트가 객체 사용을 마쳤을 때 참조 횟수를 감소시키는 데 사용된다. 새로운 참조 횟수를 반환한다. 참조 횟수가 0에 도달하면 객체는 Release 호출 중에 스스로를 삭제하므로, 호출자는 Release를 호출한 후에는 인터페이스를 사용해서는 안 된다.
interface IUnknown {
  virtual HRESULT QueryInterface (REFIID riid, void **ppvObject) = 0;
  virtual ULONG   AddRef () = 0;
  virtual ULONG   Release () = 0;
};
IUnknown 인터페이스 ID는 {00000000-0000-0000-C000-000000000046} 값을 가진 전역 고유 식별자로 정의된다.

COM 컴포넌트의 인터페이스는 반사적, 대칭적, 전이적 속성을 보여야 한다. 반사적 속성은 주어진 인터페이스에서 인터페이스 ID를 사용하여 QueryInterface를 호출할 때 동일한 인터페이스 인스턴스를 반환할 수 있는 능력을 의미한다. 대칭적 속성은 인터페이스 A에서 QueryInterface를 통해 인터페이스 B가 검색될 때, 인터페이스 B에서도 인터페이스 A를 검색할 수 있어야 함을 요구한다. 전이적 속성은 인터페이스 A에서 인터페이스 B를 얻을 수 있고 인터페이스 B에서 인터페이스 C를 얻을 수 있다면, 인터페이스 C도 인터페이스 A에서 검색할 수 있어야 함을 요구한다.

 집합, 포함 및 위임 

집합이라는 개념으로 여러 COM 객체를 결합할 수 있다. 집합된 객체의 경우, IUnknown.QueryInterface() 호출의 반환 값은 쿼리된 객체의 구현 클래스와 다를 수 있다. 이것은 많은 인터페이스를 구현하는 COM 객체를 구축하는 방법이다.
이러한 집합 객체에서는 참조 기반 수명 관리를 하고 객체 전반에 걸쳐 동등성 관계를 유지하는 것이 매우 복잡하다.

대안 전략인 포함 및 위임은 객체 지향 소프트웨어 개발에서 복합 객체의 코드 디자인 스타일과 정확히 동일하며 그러한 복합 객체에 의해 구현되므로 더 일반적이다.

 다른 플랫폼에서의 구현 

IUnknown은 macOS의 Core Foundation CFPlugIn 프레임워크의 기반으로 사용된다.Plug-ins and Microsoft’s COM at apple.com; accessed 28-May-2025
모질라의 XPCOM 컴포넌트 모델에서 이 인터페이스는 nsISupports로도 알려져 있다.nsISupports; accessed 28-May-2025

 같이 보기 
 IOleObject - 이것은 객체 연결 삽입(OLE) 객체의 기본 인터페이스이다.
 IDispatch - 이 인터페이스는 OLE 자동화 COM 객체를 위한 이름 기반 동적 메소드 디스패치를 제공한다.
 IObjectWithSite - 이 COM 인터페이스는 부모/자식 객체 쌍이 서로 연결하여 브라우저 도우미 객체(BHO)를 구현할 수 있도록 한다.
 IInspectable - COM에서 파생된 윈도우 런타임(WinRT)은 이 IUnknown에서 파생된 인터페이스를 기본 인터페이스로 사용한다.

 각주 

 외부 링크 
 COM in plain C

분류:객체 지향 프로그래밍
분류:마이크로소프트 API