728x90
반응형

API

Application Programming Interface

윈도우즈는 응용 프로그램을 위한 함수 집합을 제공하는데 이를 API라고 하며 좀 더 정확하게 표현하면 윈도우 API라고 한다. API는 특정 시스템을 위한 함수 집합을 이르는 일반명사이며 그 중의 하나가 윈도우 API입니다.

 

API는 윈도우 버전에 따라 여러 종류가 있습니다. Win32API란 본격적인 32비트 운영체제인 윈도우 95/98 NT에서 제공하는 32비트 윈도우즈를 위한 API입니다. 64비트 CPU는 AMD의 x64와 인텔의 IA64등이 있는데 이에 맞추어 64비트 운영체제가 제공되고 있습니다. 참고로 Win32API의 모든 함수들은 거의 변화없이 64비트에서도 지원되며 32비트 응용 프로그램들도 약간의 노력으로 쉽게 64비트로 포팅할 수 있습니다.

 

API는 운영체제에서 직접 사용하는 라이브러리입니다.

API Positioning

위에 그림을 보면 Windows Kernel 상단에 API 레이어를 확인해 볼 수 있습니다.

 

API는 크게 3개 모듈로 구분할 수 있습니다. 각각의 모듈은 관련 DLL에서 구현되어 있습니다.

 

API 모듈

 

사용자 정의 데이터 타입

 

윈도우에서는 사용자 정의 데이터 타입들이 많이 있습니다. 이 데이터형은 windows.h 파일에 typedef 로 선언되어 있으며 표준 데이터형처럼 사용됩니다.

 

데이터형 의미
BYTE unsigned char형
CHAR char 형
WORD unsigned short 형
DWORD unsigned long 형
LONG Long과 동일
BOOL int 형 TRUE, FALSE 중 한 값을 가짐

왜 데이터 타입을 설정하는 걸까요 ? 예를 들어 WORD형의 현재는 2byte의 부호없는 정수이지만 향후 부호없는 정수는 4byte나 혹은 다른 byte크기로 변환될 수 있습니다. 이러한 경우 WORD라는 사용자 정의 데이터 타입을 사용하다면 소스 수정없이 헤더 파일에서 WORD형의 타입 정의만 바꾸고 소스를 다시 컴파일하면 됩니다. 즉 중간타입을 정의해서 사용하는 이유는 이식성과 호환성 확보를 위해 필요합니다.

 

단 int는 UNIT라는 중간 타입이 있기는 하지만 C언어 자체에서 플랫폼에 종속적인 타입으로 정의하므로 그냥 사용해도 무방합니다.

 

유니코드

 

유니코드는 16비트의 단일 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계입니다. 문자를 사용하기 위해 타입을 선택해야 하는데 이 때 일반적으로 char 타입을 사용해 왔었습니다. 이는 DBCS(Doublebyte Charater Set) 방식으로 문자의 종류에 따라 1byte나 2byte로 표현하는 방식입니다. 이와 달리 wchar_t 타입은 유니코드 방식으로 모든 문자를 2byte 형식으로 표현합니다. ( NULL 또한 2byte입니다.)

 

핸들

 

핸들(Handle)이란 객체에 붙여진 번호이며 문법적으로는 32비트(또는 64비트)의 의미없는 정수값입니다. 윈도우에서는 여러 가지 종류의 핸들이 사용되고 있습니다. 모듈에 여러 종류의 객체들이 존재하고 이들 객체를 제어하기 위한 값이 필요한데 이를 핸들이라고 합니다.

 

핸들의 특징은 정수값이며, 사용목적은 객체를 구분하기 위함입니다. 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않습니다. 물론 다른 종류의 핸들끼리는 중복된 값을 가질 수도 있습니다.

 

또 핸들은 운영체제가 랜덤하게 발급해줍니다. 사용자는 발급된 정수값을 저장해서 사용하기만 하면 됩니다. 핸들은 예외없이 접두어 H로 시작되며 핸들값을 저장하기 위해 별도의 데이터형을 정의해 두고 있으며, 모두 부호없는 정수형입니다. 

 

인스턴스

 

프로그램은 명령들이 나열된 코드 영역과 데이터를 보관하는 데이터 영역으로 구분됩니다. 동일한 프로그램에 코드 영역까지 별도의 메모리를 할당하면 메모리만 낭비하게 됩니다. 실제 메모리 상에 할당된 객체를 인스턴스라 하며 코드 영역에 대한 모듈 인스턴스 데이터 영역에 대한 데이터 인스턴스가 있습니다. 

 

인스턴스라는 말은 클래스가 메모리에 실제로 구현된 실체를 의미합니다. 윈도우용 프로그램은 여러 개의 프로그램이 동시에 실행되는 멀티태스킹 시스템일 뿐만 아니라 하나의 프로그램이 여러 번 실행될 수 있습니다. 이 때 실행되고 있는 각각의 프로그램을 프로그램 인스턴스라고 하며 간단히 줄여서 인스턴스라고 합니다. 예를 들어 메모장이 두 번 실행되어있다고 가정하면 이 때 두 프로그램은 모두 메모장이지만 운영체제는 각각 다른 메모리를 사용하는 다른 프로그램으로 인식합니다. 이 때 각 메모장은 서로 다른 인스턴스 핸들을 가지며 운영체제는 이 인스턴스 핸들값으로 두 개의 메모장을 서로 구별합니다.

 

인스턴스

리소스

 

리로스란 메뉴, 아이콘, 커서, 비트맵 등 사용자 인터페이스를 구성하는 자원들의 정적 데이터를 말합니다. 프로그램 실행 중 변경되지 않는 정형화된 데이터로 C나 C++같은 언어로 기술하지 않고 리소스 스크립트에 의해 결정됩니다.

 

리소스는 프로그램 코드와 분리하여 작성되며 자체 컴파일 과정을 갖습니다. 리소스 스크립트 파일은 리소스 컴파일러에 의해 이진화된 리소스 파일이 만들어집니다. 리소스를 별도로 정의하는 이유는 메모리를 효율적으로 사용하기 위함입니다. 리소스에는 정적인 데이터가 있기 때문에 일반 변수와는 다른 메모리 관리를 합니다. 보통 리소스 데이터는 필요한 시점에 파일로부터 로딩이 되며 여러 개의 프로그램이 실행되어 메모리가 부족시 리소스 데이터가 할당된 메모리 블록을 이동 시키거나 폐기합니다.

 

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기