반응형

IClassFactory의 이해....


우리는 IUnknown을 보았다..... COM에는 무수히 많은 표준 인터페이스가 존재하지만, 그것을 다 알 필요는 없다. 하지만, IClassFactory는 IUnknown만큼이나 중요한 인터페이스이기 떄문에 당근 이해해야 한다.


IUnknown의 함수 세가지가 라이프 사이클을 관장하는 것이었다는 걸 기억하는가? 그떄 이런 말을 기억할것이다. COM안의 객체들은 스스로 생성되며, 스스로 사라진다는것.....  이건 첨에 COM의 장점에 대해 논의할때도 나왔던 얘기다. IClassFactory라는 녀석은 즉 COM을 생성하는 것에 관련된 놈이다. 좀더 정확히는 오브젝트를 생성하는 것이다.


이제부터 집중해라. 설명을 얼마나 잘할지는 모르지만, IClassFactory는 난해하다. 일반적인 COM책에는 하나의 IClassFactory를 구현한 클래스가 존재하고, 그것은 다른 실제 우리가 필요로하는 COM객체를 생성한다고 되어있으며, 강조하는 것이 언제나 1:1관계로써 하나의 클래스 팩토리는 하나의 종류의 Class Object를 생성한다는 것이다.


 이해하는가?


풀어서 써보면, 이렇다. 대부분의 언어에는 객체를 생성하기 위한 명령어가 존재한다. 이를테면, C++에서는 new가 있다. 하지만, 이건 COM에는 부적합하다. 왜냐구? 일단 COM은 언어독립적이어야 하구.... 그 담에는 COM은 보다 강한 Encapsulation을 보장하기때문에 내부적으로 어떻게 생성되는지 알아서는 안된다.(new의 경우 뭐 오버로딩하면 뭐 또 다르겠지만, 일단 new로 호출된 객체의 모든 멤버는 메모리에 로딩된다. 그에비해 고급 COM의 기술로 가면 TearOff등의 기술이 있어서 자주쓰이지 않을것 같은 서비스는 로딩을 미루거나 할수도 있다.) 뭐 하여간 이래서, IClassFactory라는 인터페이스가 필요하게 된다. IClass Factory의 멤버는 다음과 같다.


CreateInstance와 LockServer라는 놈이 그 안에 들어있다.


이중에 CreateInstance라는 놈이 바로 Factory가 생성할 객체를 생성하는 놈이다.


여기서 나의 경우에 처음 COM을 접했을때 의문을 가졌었다.....


"바루 만들면 안돼나?" 라는 것과 그럼 Class를 생성하는 바로 "이 놈은 누가 메모리에 생성하지?" 오랜시간 COM의 개발로 인해 쌓은 경험으로 내린 결론은 그렇다. 일단 CreateInstance와 같은 모든 COM에 적용되는 함수가 있어야 한다는 것, 그리구.... 클래스 팩토리로써 구현된 객체는 DLL등의 COM server가 메모리에 올라갈떄 같이 생성된다는 것이다.


또한 LockServer라는 놈은 말그대루 서버를 잠시 잠그는 것이다. 이것은 어떤 동기화의 일종으로 생각해두 돼구 싱크를 맞춰야 한다고 해야할까? ClassFactory가 객체를 생성하는 동안에 Server가 메모리에서 내려가거나 하는 경우를 막기 위한 것이다.



정리하자.....

사실 ClassFactory에서 이해해야 하는 것은 객체를 생성하기 위한 함수가 있고, 그걸 구현하는 클랫스가 따로 구현되어야 하며, 그 클래스는 오직 한 종류의 객체를 생성하는 것이라는 거.....


어려운가.... 사실 쓰는 사람두 이 부분 공부할떄 설명을 저따위로밖에 못하나 했는데.... 나역시 이거 설명하기가 많이 어렵다. 정 어려우면 다시 정리하건데.... CreateInstance를 통해 객체를 생성한다는 것을 기억해라.....

반응형

+ Recent posts