COM
COM(Component Object Model)은 마이크로소프트에서 개발한 소프트웨어 기술로, 다양한 애플리케이션이 서로 간에 객체(오브젝트)를 공유하고 재사용할 수 있도록 하는 프레임워크입니다. COM은 언어와 플랫폼에 독립적이기 때문에, COM 기반의 객체는 C++, C#, Visual Basic, Python 등 다양한 프로그래밍 언어로 작성된 애플리케이션에서 사용할 수 있습니다.
오브젝트와 시스템이 개방적이고 변화 가능한 방식으로 상호 동작할 수 있는 방법을 정의하는 다수의 기술에 대한 바이너리 사양
COM의 주요 개념
- COM 객체: COM 객체는 인터페이스를 통해 상호작용할 수 있는 객체입니다. 이 객체는 특정 기능을 구현하고, 인터페이스는 이 객체의 기능에 접근할 수 있는 방법을 정의합니다.
- 인터페이스: 인터페이스는 클래스의 메서드 집합을 정의하며, COM에서 객체는 인터페이스를 통해 접근됩니다. 각 인터페이스는 고유한 식별자를 가지며, 이 식별자는 GUID(Globally Unique Identifier)로 표현됩니다.
- IUnknown 인터페이스: 모든 COM 객체는 IUnknown 인터페이스를 구현해야 합니다. 이 인터페이스는 참조 카운팅과 인터페이스 쿼리 기능을 제공합니다.
- QueryInterface: 객체가 지원하는 인터페이스를 요청합니다.
- AddRef: 객체의 참조 카운트를 증가시킵니다.
- Release: 객체의 참조 카운트를 감소시키며, 카운트가 0이 되면 객체를 메모리에서 해제합니다.
- COM 서버와 클라이언트: COM 객체는 COM 서버에서 생성되고 관리됩니다. COM 서버는 DLL(동적 링크 라이브러리) 또는 EXE(실행 파일)로 구현될 수 있습니다. COM 클라이언트는 이러한 COM 객체를 사용하여 필요한 작업을 수행합니다.
- COM의 등록 및 활성화: COM 객체를 사용하기 위해서는 먼저 COM 서버가 레지스트리에 등록되어야 합니다. 이를 통해 클라이언트가 COM 객체의 CLSID(Class ID)를 사용하여 객체를 생성하고, 해당 객체의 인터페이스에 접근할 수 있습니다.
1. COM 객체 (COM Object)
COM 기술의 핵심 단위로, 특정 기능을 캡슐화하여 다른 애플리케이션이나 구성 요소에서 사용할 수 있는 독립적인 소프트웨어 구성 요소
COM 객체는 특정 작업을 수행하는 메서드와 데이터를 포함하고 있으며, 객체 지향적 프로그래밍의 원칙을 따름
COM 객체는 특정 기능을 캡슐화한 독립적인 구성 요소로, 다양한 어플리케이션에서 재사용될 수 있고, 언어 독립적임
1-1. 독립성
- COM 객체는 독립적으로 생성되고, 특정 응용 프로그램에 속하지 않음
- 따라서 다양한 애플리케이션에서 재사용될 수 있음
- 다른 프로그래밍 언어로 작성된 코드에서도 사용
1-2. 이진 호환성
- COM 객체는 이진 수준에서의 호환성을 제공하므로, 객체를 사용하는 어플리케이션이 어떤 언어로 작성되었든 상관없이 통신이 가능
- 이로 인해 COM 객체는 여러 환경에서 일관되게 작동할 수 있음
1-3. 위치 투명성
- COM 객체는 로컬 시스템이나 네트워크를 통해 원격에서 접근할 수 있음
- Distributed COM(DCOM)을 사용하면, 객체의 물리적 위치와 관계없이 동일한 방식으로 접근할 수 있음
1-4. 참조 카운트 관리
- COM 객체는 참조 카운트를 기반으로 메모리를 관리
- 객체가 더 이상 참조되지 않으면 참조 카운트가 0이 되고, 이때 객체는 메모리에서 해제됨
2. 인터페이스 (Interface)
COM 객체가 제공하는 기능에 접근하는 방법을 정의하는 계약(contract)
인터페이스는 특정 기능을 수행하는 메서드의 집합으로, 이 메서드를 통해 외부에서 객체의 기능을 사용할 수 있음
인터페이스는 COM 객체의 기능에 접근하는 계약으로, 객체의 구현 세부 사항을 감추고, 다수의 언어에서 일관된 방식으로 사용할 수 있게 함
2-1. 계약 기반 상호작용
- 인터페이스는 객체가 제공하는 기능을 정의하는 계약
- 인터페이스를 사용하면 객체 내부의 구현 세부 사항에 대한 지식 없이도 객체의 기능을 사용할 수 있고, 이는 모듈화와 유연성을 높임
2-2. 언어 독립성
- 인터페이스는 이진 표준을 사용하여 정의되므로, C++, Visual Basic, C# 등 다양한 프로그래밍 언어에서 동일한 인터페이스를 사용할 수 있음
- 이로 인해 다양한 언어로 작성된 어플리케이션 간에 상호 운용성이 보장됨
2-3. 고유 식별자(IID)
- 각 인터페이스는 고유한 식별자(Interface Identifier; IID)를 가지며, 이 식별자를 통해 특정 인터페이스에 접근할 수 있음
- COM 객체는 여러 인터페이스를 구현할 수 있으며, ‘QueryInterface’ 메서드를 통해 필요한 인터페이스에 대한 포인터를 요청할 수 있음
2-4. 다중 인터페이스 구현
- COM 객체는 여러 인터페이스를 구현할 수 있음
- 하나의 객체가 IUnknown, IDispatch, ICustomInterface 등의 여러 인터페이스를 구현할 수 있으며, 각 인터페이스는 객체의 서로 다른 기능을 제공
3. IUnknown (Interface)
COM에서 사용되는 기본 인터페이스, 모든 COM 인터페이스는 IUnknown을 상속받음
COM 객체의 수명 관리와 인터페이스 검색 기능을 제공하는데 필수
QueryInterface 메서드를 통해 런타임에 객체가 지원하는 인터페이스에 접근할 수 있게 해주고, 이로 인해 클라이언트는 특정 인터페이스에 의존하지 않고도 다양한 COM 객체를 사용할 수 있음
AddRef 와 Release 메서드를 통해 객체의 수명을 관리하며, 이를 통해 메모리 관리를 자동화함
3-1. QueryInterface (Method)
- 이 메서드는 특정 인터페이스의 포인터를 요청하는데 사용됨
- COM 객체는 여러 인터페이스를 구현할 수 있으며, 이 메서드를 통해 해당 인터페이스에 접근할 수 있음
- 요청한 인터페이스를 지원하면 해당 인터페이스의 포인터를 반환하고, 지원하지 않으면 ‘E_NOINTERFACE’ 반환
3-2. AddRef (Method)
- 이 메서드는 참조 카운트를 증가시키는 역할을 함
- COM 객체는 참조 카운트 방식으로 메모리 관리를 수행하며, AddRef를 호출하여 객체의 수명을 연장할 수 있음
3-3. Release (Method)
- 이 메서드는 참조 카운트를 감소시키고, 참조 카운트가 0이 되면 객체를 메모리에서 해제
- 이 방식으로 COM은 메모리 누수를 방지함