#21. DLL에 대한 의문점들…

아직 DLL에 대해서도 배우지도 않았건만 벌써 DLL을 언급하냐고 하실지도 모르겠습니다. 하지만 나중에 DLL을 사용하실 때에 혼란을 방지하기 위해서 이곳에 미리 게재합니다.


DLL이라고 함은 동적 연결 라이브러리 (Dynamic Link Library)를 가리키는 용어입니다. 이것은 32비트 Windows 및 향후 64비트 Windows에서 가장 잘 돌아가는 공유 라이브러리 시스템입니다.


실제로 여러분이 Windows 프로그래밍을 하다가 보면 프로젝트 규모가 어마어마해집니다. 그런 파일들을 한꺼번에 EXE 프로세스 안에다가 다 집어넣으시겠습니까? 그렇게되면 사용자들로부터 엄청난 원성을 듣게 될지도 모릅니다.


프로그램의 각 카테고리별로 기능을 분류하여 DLL 파일로 가볍고 유연하게 만들어주면 EXE 파일 자체의 용량도 크게 줄어서 1회에 필요한 메모리 분량을 대폭 줄일 수가 있습니다. DLL은 필요할 때, 그러니까 EXE에서 DLL 호출 코드에 도착했을 때에만 불러들여지며 DLL이 필요없다는 시점에서 DLL 로드가 해제되어 메모리 여유 공간을 살립니다.


하지만 지나치게 많은 DLL 파일이 난무할 경우 프로그래머 입장에서는 굉장히 다루기가 곤란한 프로그램이 되어버립니다. 왜냐하면, 해당 DLL을 호출하는 코드의 상세 구문을 알기 위하여 해당 DLL 프로젝트를 또 열어야 하니까요. 또한 디버그 과정도 훨씬 복잡하고 비효율적으로 변모합니다. 이것은 프로그래밍의 능률을 떨어뜨리게되는 요인의 하나에 속합니다.


DLL은 너무 자제해서도, 너무 남용해서도 안됩니다. 무엇이든 적당히 해야 좋은 것이지 좋다고 해서 너무 남용하면 생각지 못한 곳에서 문제가 발생하게 되는 것입니다.


그렇다면 DLL과 EXE파일의 차이가 무엇인지 알아보겠습니다.


AFX (Application Frame Works, MFC) 상에서 작성된 DLL 파일은 실제 EXE파일과 그 구성요소가 동일하지만 초기에 제공되는 클래스나 설정의 차이외에는 없습니다. 심지어는 리소스 (버전 테이블, 대화 상자, 웨이브 데이터, 웹 도큐먼트 등등…)도 그대로 사용이 가능합니다. 프로그래밍도 EXE에서 하시던 그대로 하시면 됩니다. 즉, 차이가 거의 없다는 것을 의미합니다.


하지만 특수한 경우의 DLL이 존재한다는 것을 기억하시기 바랍니다.



  • 유형 1; 16비트 DLL – 예전에 Windows 3.x, Windows for Workgroups 3.x, Windows NT 3.x 상에서 쓰여지던 아주 원시적이고 기초적인 수준의 DLL 파일들입니다. 이것들은 Windows 9x 상에서는 어느정도 호환성을 보장하지만 Windows NT 계열 (Windows NT, 2000, XP, .NET, …)에서는 전혀 사용할 수 없습니다. 또한 이런 16비트 DLL을 사용하는 것은 프로그래밍에도 도움이 안될뿐더러 생산된 산물역시도 비효율적입니다.
  • 유형 2; 다른 언어가 생성한 Windows용 DLL – 다른 언어가 생성한 Windows용 DLL은 Windows에서 인지할 수 있는 DLL입니다만 MFC에서는 인지하지 못하는 DLL입니다. 또 그 반대로 MFC에서 생성한 DLL은 Windows에서 인지할 수 있는 DLL입니다만 다른 언어에서는 인지하지못하는 DLL입니다.

Windows 프로그래머가 이런 점에 대하여 깊숙히 고려할 필요는 없지만, 이렇게 특수한 DLL이 있다는 것만 아시기 바랍니다.


DLL 작성법은 MFC 완벽 가이드에도 잘 설명이 되어있으니 실제 강의에서 강의받기 전에 먼저 읽어보고 넘어가시는 게 더 유용할 것이라고 봅니다.

댓글 남기기