반응형

COM의 Life Cycle의 이해(IUnknown의 이해)


 COM의 형태는 DLL과 같은 라이브러리 형태와 EXE와 같은 이진 파일의 형태로 되어있다. COM의 장점인 위치투명성과 언어 독립성을 이루기 위해 다른 일반 DLL등과는 다른 방식으로 객체를 생성한다. exe와 같은 형태는 서비스를 이용하는 프로그램과는 다른 위치에 프로세스를 가질 것이며, 이는 곧 서비스를 원하는 프로세스가 해당 서비스를 메모리에 로딩하고, 또한 메모리에서 내리는 이런 행위를 하는 것이 아니라 COM스스로가 자신을 메모리에 로딩하고 해제해야 한다는 의미가 된다. 좀 어려운가?


 쉽게 다시 말하면 COM은 여러가지 이유로 자신 스스로를 메모리에 생성하고, 또한 자신 스스로 메모리에서 해제한다. 그것도 가장 경제적인 메커니즘을 통해 이를 수행한다. 이는 모든 COM에 적용되는 것이며, 이를 구현하기 위한 멤버함수를 포함한 인터페이스인 IUnknown을 상속받아서 작성되어야 한다는 것이 COM의 규약중 하나이다. 거꾸로 말하면, 모든 COM은 반드시 IUnknown인터페이스를 상속받아 작성되어야 하며, IUnknown이 명시한 세가지 함수를 반드시 구현하여야 하며, 이를 통해 COM은 자신의 생명주기(Life-Cycle)을 관리한다.


 오랜기간 C++ 프로그램이나 JAVA등과 같은 프로그래밍을 해본 사람들은 어디선가 객체를 관리하기 위한 방법으로 참조카운트라는 것을 들어본 적이 있을 것이다. COM은 자신의 생명주기를 이 참조카운트라는 것으로 관리한다.


이해하기 쉽게 이를 관리하는 함수들을 살펴보자.

IUnknown에 포함된함수는 다음 세가지이다.


AddRef, Release , QueryInterface


이중에서 AddRef함수와 Release함수가 생명주기를 관리하는 함수이다.

AddRef는 COM의 서비스를 참조하는 프로그램의 갯수표시를 증가시키는 함수이며,

Release는 거꾸로 감소시키는 함수이다.

Release함수내에는 자신의 참조를 감소시키다가 참조카운트가 0이되면 자신을 메모리에서 삭제하도록 구현하곤 한다.


아. 얘들은 IUnknown의 멤버이며, IUnknown은 인터페이스이므로, 당연히 이 세가지 함수의 내용은 구현돼어있지 않다. 인터페이스의 상속은 순수가상함수라고 싶게 이해하면 된다. 이 얘기는 당신이 모든 내용을 구현해야 한다는 얘기다.(걱정할 필요는 없다. 그래서 ATL등의 도구가 존재한다.WINAPI날코딩노가다를 위해 MFC가 있듯이.....COM날코딩 노가다를 위해 ATL이 있다. 주의할거는 WINAPI를 몰라두 MFC를 사용하는데 문제가 없지만, COM을 모르면 ATL코딩시 대략 낭패다. MFC는 편의, 생산성이 우선이지만, ATL은 그거보다는 성능에 우선하도록 설계되어 있다.)


잠깐 딴데루 샛군....


어찌되었던간에......


당신은 어디까지 이해했는가.....


정리하면, COM은 참조카운트라는 것을 사용하며....그것으로 생명주기를 관리한다......

게임프로그래머들은 DirectX사용시 delete를 쓰지 않고, Release를 사용한다는 걸.....

서버나 디비쪽의 ADO 를 사용하는 당신은 역시 ADO객체를 위해 delete를 쓰지않고, Release를 사용한다는 것을 기억할 것이다. delete는 지운다이고, Release는 놓아준다는 의미이다. COM을 사용하는 당신은 COM객체를 삭제하지 않고 더이상 사용하지 않겠다는 의사를 표시하며 놓아주면, COM객체가 자기를 참조하는 애들을 세고있다가 자기를 아무도 참조안하면 그제서야 자기 스스로 사라져 준다는 것이다. COM을 만드는 사람에게 있어서는 당근......객체의 생성과 소멸을 책임져야 한다는 의미가 된다......


오늘의 이해는 생명주기의 이해이다....  IUnknown의 코딩에 대해서는 당신이 알필요는 없다....

뭐 알고싶으면 책을보면 돼겠지만..... 중요한것은 생명주기의 이해와  IUnknown의 함수의 이해이며, 어찌 코딩하는지가 아니다....(코딩은 ATL같은데서 해준다.)

다음에 IUnknown의 QueryInterface에 대해서 보자.

반응형

+ Recent posts