블로그 이미지
대갈장군

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Notice

'COM'에 해당되는 글 2

  1. 2009.03.14 COM (Component Object Model) 과 DirectShow2
  2. 2008.10.17 [MSDN] COM (Component Object Model)2
2009. 3. 14. 04:00 프로그래밍/DirectShow
참 이상한것이 DirectShow에 대한 책이나 정보가 한국어로 된것은 매우 드물다는 점이다. 신화선님이 출판한 DirectShow 멀티미디어 프로그래밍이란 책을 제외하고는 한국어로 된 DirectShow 서적은 없다고 봐야한다.

원어로 된 서적도 없기는 마찬가지다. 그래서 그런지 더더욱 자료를 찾기가 어렵다.

DirectShow의 각종 Application 작성에 대해서 블로그를 작성하기 전에 COM에 대해서 분명히 말해두고자 한다.

왜냐면 DirectShow의 필터들이 사실 전부 COM 기반이기 때문이다. 사실 따지고 보면 COM은 C++과 크게 다르지 않다. 다만 '어떻게 사용하나?' 를 알아야 한다는 점이 중요할뿐.

C++의 클래스는 전적으로 사용자에게 권한을 100% 준다. 내가 만들고 싶은 뭐든 내 맘대로 작성하면 그만이다. 멤버 함수, 변수 등 구현, 정의 모두 내 맘대로다.

헌데 거기서 한가지 문제점이 발생하는데 프로그램을 짜본 사람은 알겠지만 제법 규모가 있는 프로그램, 뭐 예를 들자면 동영상 재생 프로그램, 오디오 재생 프로그램 같은거를 만들고 싶다고 하자. 

C++의 내 맘대로 작성하여 만든 클래스를 사용하여 만드는 프로그램은 그 규모가 공사에 비교했을때 소형 주택 짓는 정도라면 동영상 재생 프로그램과 같은 것은 거의 10 층 빌딩 만드는 수준의 전문적 공사이다.

그렇다면 일반 프로그래머가 지하부터 공사시작해서 10층까지 빌딩을 완성시킬수 있을까? 불가능하다... 뭐 아주 불가능 하지는 않지만 시간이 오~~~래 걸린다.

바로 그렇기 때문에 프로그램 회사 (Microsoft) 같은 곳에서 일반 프로그래머도 10층 빌딩을 신속하게 지어 올릴수 있도록 친절하게 다양한 빌딩을 짓기 위한 '뼈대'와 '재료'를 제공을 해준다.

그것이 바로 COM기반의 DirectShow이다. DirectShow는 멀티미디어 (동영상, 오디오) 를 사용해 결과물을 작성해야 하는 개발자들을 위해 제공되는 다양한 함수와 클래스이다.

하지만 일반 C++ 클래스와는 달리 COM은 매우 인공지능적이다. 우선 스스로 자신의 객체가 몇번이나 복사되었는지를 스스로 관리하여 카운터가 0이되면 스스로 자신을 파괴한다. 고로 컴퓨터에 유령처럼 떠도는 메모리 leak를 원초적으로 차단하고자 했다.

물론 여전히 프로그래머가 메모리 leak를 유발할 수는 있지만 그래도 C++ 클래스 원조보다는 훨씬 영리하다.

또한 '조립'과 '대화'가 가능한 클래스이다. 조립이 가능하다는 것은 COM 객체 생성함수인 CoCreateInstance() 함수의 첫번째 인자와 네번째 인자를 사용자가 적절히 선택함으로써 어떤 '건물의 외관'에 '내부의 기능'을 만들것인지를 정할수 있게 했다.

건물의 외관이 바로 CLSID_ 머리말이 붙은 식별자이며 사실상 이것은 클래스이고 즉, '설명서' 일 뿐이다. CLSID는 Class ID의 약자임을 알았다면 당연한 이야기다.

네번째 인자인 '내부의 기능'IID_ 머리말이 붙은 식별자이며, 이것은 Interface ID의 약자이다. Interface는 한국어로 해석하기 좀 애매하지만 간단히 말하자면 걍 '함수'다. 이 인터페이스는 내가 어떤 기능 (함수)를 사용하고 싶다는 것을 알려준다.

고로 CoCreateInstance()는 사실 내가 만들고자 하는 클래스와 함수를 컴퓨터에 알려주고 COM 라이브러리에서 내가 원하는 형태의 객체를 뚝딱 만들어서 나에게 돌려준다.

다른 한가지 특별한 점으로 '대화'를 꼽았는데 이는 바로 QueryInterface()라는 함수 때문이다. 기본적으로 모든 COM객체는 IUnknown 인터페이스를 가지고 있다. 즉, 모든 COM 객체는 IUnknown 인터페이스가 제공하는 3가지의 함수(QueryInterface,AddRef,Release)를 가지는데 그중 하나가 바로 QueryInterface()함수이다.

이 함수는 COM 객체에게 '너 이 기능 할줄 아니?' 라고 물어보는 역활을 한다. 만약 가능하면 COM 객체는 그 기능으로 향하는 출입문인 Interface Pointer를 리턴하고 만약 안되면 NULL을 리턴하여 불가능 하다고 대답한다.

이전에 내가 COM에 대해서 쓴 글에서도 보면 이 점 때문에 COM은 '뇌를 가진 클래스'라고 했었다. 프로그램 개발자가 모든 함수를 다 알고 있어서 바로 그 함수를 찍어서 호출하는 방법보다 훨씬더 안정적이다. 왜냐면 컴퓨터마다 차이가 있으므로 어떤 컴퓨터에서는 되고 안되고를 알수 없는데 COM 객체를 이용해 QueryInterface를 하면 쉽게 현재의 컴퓨터에서 그 기능이 가능한지 알수 있기 때문이다.

예전에도 말했듯이 이런 COM과 같은 놈들은 C++과는 전혀다른 새로운 언어가 아니다. 이런 COM은 프로그램을 작성하는 '틀'과 '방법'을 제공해주는 거대한 도서관 같은 놈이다. 사용자가 알아야 하는 것은 몇 층의 무슨 책을 찾아야 하는지대출은 어떻게 하는지만 알면 된다. 

DirectShow에서 COM을 사용한 이유는 정확히는 모르지만 동영상과 오디오를 주로 다루는 DirectShow에서는 여러개의 필터들을 연결해서 재생하는데 이런 과정에서 필터 간의 안전한 연결과 실제로 중요한 부분인 Encoding 과 Decoding 부분의 완벽한 정보 은폐, 그리고 아마도 COM 기술을 프로그램 업계의 기반으로 만들려고 그러지 않았을까?... 그럴까?

posted by 대갈장군
2008. 10. 17. 07:00 프로그래밍/MSDN

COM 그 이름만 들어도 살짝 현기증이 날 듯한 이름... Microsoft의 작명 센스는 끝내준다. 몰라도 들어본 것 같고 알아도 헷갈리게 만드는 놀라운 작명 센스... /후아

내 블로그에 남기는 글들은 특정한 기술에 대한 'Teaching' 이 아닌 'Talking' 일 뿐이므로 머리를 쪼그라 들게 하는 깊이 있는 이야기보단 지나가는 이야기이지만 보다 쉽게 이해하기 위해 쓰는 것이므로 이해해 주길 바랍니다.

COM 에 대한 첫 만남은 DirectShow에서 시작되었다. 어찌하다 보니 DirectX를 사용해야 하는 상황이 생겼고 나중에는 DirectShow를 사용해야 하는 상황이 왔던 적이 있다.

물론 전혀 즐겁지 않았다.. -_- DirectShow의 자료를 뒤적거리다 첫 대면을 하게된 COM이란 놈은 DirectShow의 '근간' 이요 '근본' 이며 '바탕'이므로 꼬옥! 알아야 한다는 거였다. 줴엥장.

그때는 시간이 없던 관계로 COM에 대한 이해를 할 시간도 없이 '어떻게' 사용하는가만 집중적으로 판다음 완전히 잊어버리고 살았다.

하지만, 오늘 MSDN에서 COM에 대한 문서를 읽어보니 내가 참 무식했구나 하는 생각이 들었다. 물론 '방법'만 알면 오케이인 일도 많지만 '원리'와 함께 알면 절대 잊어버리지도 않을 뿐더러 연결되는 기술이나 개념에 대한 이해가 훨씬 더 쉽다. 그래서 많은 시간을 투자해가면서 MSDN의 미로를 헤메는 중이다.

COM의 정의는 서로간에 의사 전달이 가능한 프로그램의 구성 요소를 플랫폼에 독립적이고 객체 지향적으로 만들어주는 일종의 System이다.


이말 읽고 바로 이해되는 사람이 있다면 이글을 읽어볼 필요도 없는 사람이라고 생각한다.-_- 기본적인 프로그램만 짜본 사람의 입장으로써는 이글은 '김밥 옆구리 터지는' 소리다. 한마디로 뭔소린지 잘 모른다.

내가 생각하는 COM의 정의는 '뇌를 가진 C++ 클래스' 정도? 헐헐헐.. 이건 또 뭔소리? 라고 할수 있다. 이제 차근 차근 설명해 보겠다. 왜 COM이 뇌를 가진 C++ 클래스라 생각하는지.

우선 Interface와 Methods가 뭔지 알아야 하는데... 흠... 이걸 여기서 설명하게 되면 COM의 개념만 쉽게 풀고자 했던 내 의도가 딱딱한 MSDN 문서를 읽어주는 것과 다를게 없어지는 것 같아서 안쓰는게 좋을것 같다.

우선 COM의 단어적 의미를 집어내 보면 '요소 객체 모델'인데 모델은 어떤 체계를 말하므로 빼버리고 C가 의미하는 Component인 요소에 집중해 보자.

내가 앞서 말했듯이 DirectShow는 COM을 기반으로 하는데 DirectShow로 짜는 프로그램의 구성을 보게 되면 마치 전산시간에 배웠던 Flow Chart를 그리는 것과 똑같다.

전산 시간에 네모를 그러서 그 사이를 화살표로 연결하여 그렸던 흐름도 혹은 논리 흐름도를 기억하는가?

DirectShow의 시작은 입력과 출력을 가지는 Filter 라고 불리는 사각형들이 서로 물고 물리는 관계를 형성함으로써 시작된다. 하나의 Filter 출력이 다른 Filter의 입력으로 들어가게 되고 또 그 출력이 다른 입력으로 들어간다.

이런식으로 Data가 '물 흐르듯이' Stream을 가지게 되고 이처럼 쉽게 하나의 프로그램을 완성 할수 있다.

바로 여기서 보면 각각의 Filter가 하나의 COM이고 바로 '요소' 인 것이다. 프로그램을 구성하는 본질적인 요소임과 동시에 마치 레고 블록처럼 독립적이어서 가져다 붙여주고 서로 잘 이어주기만 하면 되는 것이다.

사실 이것은 JAVA의 상속과 크게 다르지 않다. C++의 상속과 재활용성과도 일맥 상통한다. 하지만 결정적인 차이가 있으니 바로 '뇌를 가진' 이라는 단어다.

COM으로 만들어진 객체는 이른바 QueryInterface라는 함수를 가지고 있다. 이건 무조건 모든 COM 객체가 가지는 함수로써 마치 C++의 생성자/파괴자와 같이 무조건 필요한 놈이다.

이 QueryInterface 함수의 특이점은, 프로그래머는 반드시 이 함수를 이용해서 COM객체의 다른 함수의 포인터 (진입점) 을 얻어와야 한다는 것이다.

Query의 단어 뜻 그 자체가 '질의한다'라는 의미로써 프로그래머가 COM객체에게 '야, 너 이런이런 함수 지원해주니?' 라고 물어보는 것이다.

더 놀라운 것은 이 COM 객체는 프로그래머가 저렇게 물어왔을때, 만약 지원이 가능하면 해당 기능으로 들어가는 문 (포인터)를 알려주고 만약 지원이 안되면 '안되요!' 라고 하면서 NULL 을 리턴한다는 것이다.

이게 뭐가 대단한가? 라고 의아해 한다면 당신은 아마도 잘못된 함수의 호출로 인해 공포의 퍼런 화면을 한번도 안띄워 본 사람! 우후훗!

뇌를 가졌다고 말하는 이유는 바로 이 기능 때문이다. COM 객체는 스스로가 할수 있는 일과 없는 일은 명확히 구분하여 프로그래머의 사용 미숙이나 강제 호출에도 스스로 'NO' 라고 말할 수 있기 때문에 나는 COM이 생각하는 클래스라고 말했다.

사실 여전히 COM 객체는 프로그래머에게 종속적이기는 하지만 스스로의 독립성과 안전성을 지키려고 하는 것은 예전에 C++의 클래스에서는 찾아보기 힘든 점이다.

MSDN에서 말하기를 'COM 객체는 프로그래머 (혹은 클라이언트) 와 Negotiate 한다.' 라고 했다. 즉, '협상'을 한다는 말인데 프로그래머와 대등한 입장에서 서로 대화를 주고 받는다는 의미라 하겠다. 세상 참 좋아졌다... 컴퓨터가 나랑 협상을 다하고... ㅋㅋ

많은 사람이 착각을 하는 것이 COM이 그 자체로 또다른 '언어'라고 생각하는 것인데 (C나 C++처럼) 사실 그렇지 않다고 생각한다.

다만 COM과 같은 '체계' 혹은 '모델'은 사용자에게 보다 나은 방법의 프로그램 설계 방식을 '제안'하고 있을 뿐이다.

그것을 이해한다면 COM이나 MFC에 대해 겁부터 덜컥 먹을 일이 전혀 없다. C와 C++부터 차근 차근 알아나가면 점점 탄력이 붙어 나중에는 자연스레 이해할 수 있게 된다.

이제 결론을 말하자면,

COM은 '생각하는' 혹은 '협상할줄 아는' 함수들의 집합체로써 사용자와 '대화'를 통해 만들어져 있는 수많은 좋은 함수들을 공짜로 '제공'해준다.


다만 이 COM을 제대로 사용하기 위해서 반드시 따라야 하는 조건들만 잘 지키면 무리없이 잘 사용할 수 있다는 점.

그리고 COM의 장점이라면,

무조건 프로그래머의 명령에 'YES"라고 대답하지 않고 우선 할 수 있는건가 아닌가 찾아보는 '똑똑함' 이랄까? :)
posted by 대갈장군
prev 1 next