C++
#include <iostream>
using namespace std;
//템플릿 클래스의 정의
//template<class A, class B, int NUM> //1, 1번과 2번은 동일한 문장
template<typename A, typename B, int NUM> //2,
class TwoArray
{
public:
A arr1[NUM];
B arr2[NUM];
};
int main()
{
TwoArray<int, float, 20> Obj1; //템플릿 클래스의 사용
//arr1[NUM] 배열 생성 배열이 첫번째 즉 0번지에 77대입
Obj1.arr1[0] = 77;
//arr2[NUM] 배열 생성 배열이 첫번째 즉 0번지에 0.1대입
Obj1.arr2[0] = 0.1f;
cout <<"Obj1.arr1[0] : " <<Obj1.arr1[0] <<endl;
cout <<"Obj1.arr2[0] : " <<Obj1.arr2[0] <<endl;
return 0;
}
|
#include <iostream>
using namespace std;
//템플릿 함수 정의
template<class T>
//인자와 반환 값의 타입으로 템플릿 매개 변수 T사용
T Max(T num1, T num2)
{
//3항 연산자 ? 앞의 조건이 참이면 : 앞의 값 거짓이면 : 뒤의 값 리턴
return (num1 > num2 ? num1 : num2);
}
int main()
{
int i1 = 100;
int i2 = 200;
int iBig = Max(i1, i2); //int 형의Max 함수 호출
cout <<"큰 수는 : " <<iBig <<endl;
float f1 = 0.5f;
float f2 = 1.8f;
float fBig = Max(f1, f2); //double형의 Max 함수 호출
cout <<"큰 수는 : " <<fBig <<endl;
return 0;
} |
#include <iostream>
using namespace std;
template <class Z>
class Array
{
public:
Array() //생성자
{
Elems = 0;
NumElems = 0;
}
~Array() //소멸자
{
if(0 != NumElems)
{
delete[] Elems; //동적 할당 소멸
}
}
void SetSize(size_t value)
{
delete [] Elems;
NumElems = value;
//동적 할당받은 배열의 번지마다 다시 동적 할당
Elems = new Z[value];
if(0 == Elems) //동적 할당을 못받았을 경우
{
NumElems = 0;
}
}
size_t GetSize()
{
cout <<"GetSize() 호출" <<endl;
}
void SetElem(size_t index, Z value)
{
if(NumElems <= index) //배열 몇개 만들었는지 검사
{
return ;
}
Elems[index] = value; //배열 갯수 수정
}
Z GetElem(size_t index)
{
if(NumElems <= index)
{
return Z(); //임시 객체 리턴
}
return Elems[index];
}
private :
//Elems타입은 Musician **Elems 더블 포인터이다
//메인문의 템플릿 클래스 사용부분에서 클래스 포인터로 정의 됨
Z *Elems;
size_t NumElems;
};
class Musician
{
public:
virtual void greet(); //가상 함수 객체기반 호출
virtual void play(); //
};
void Musician::greet()
{
cout << "뮤지션 인사 : 안녕~ " <<endl;
}
void Musician::play()
{
cout << "뮤지션 연주 : 딴따~ " <<endl;
}
class Trumpeter : public Musician
{
public:
void greet()
{
cout << "트럼펫 인사 : 하이~ " <<endl;
}
void play()
{
cout << "트럼펫 연주 : 빰빠~ " <<endl;
}
};
class Flautist: public Musician
{
public:
void greet()
{
cout << "풀룻 인사 : 하이~ " <<endl;
}
void play()
{
cout << "풀룻 연주 : 삐리리~ " <<endl;
}
};
void WarmUp(Musician *pm)
{
cout <<"오케스트라 단원입니다..." <<endl;
pm->greet(); //가상 함수 객체기반 호출
cout <<"소리 내봐..." <<endl;
pm->play(); //가상 함수 객체기반 호출
}
#define MEMBER 10
int main()
{
//템플릿 클래스 사용 , 클래스 포인터 형으로
Array<Musician *> orchestra;
int iCnt;
//10개의 동적 할당 받은 배열 생성
orchestra.SetSize(MEMBER);
orchestra.SetElem(0, new Trumpeter);
orchestra.SetElem(1, new Flautist);
orchestra.SetElem(2, new Trumpeter);
orchestra.SetElem(3, new Trumpeter);
orchestra.SetElem(4, new Flautist);
orchestra.SetElem(5, new Trumpeter);
orchestra.SetElem(6, new Flautist);
orchestra.SetElem(7, new Flautist);
orchestra.SetElem(8, new Trumpeter);
orchestra.SetElem(9, new Flautist);
cout <<"오케스트라 소개 및 웜업 입니다.." <<endl;
for(iCnt = 0; iCnt<MEMBER; iCnt++)
{
WarmUp(orchestra.GetElem(iCnt));
}
//배열 요소마다 다시 동적할당 받은 메모리 해제
for(iCnt = 0; iCnt<MEMBER; iCnt++)
{
delete orchestra.GetElem(iCnt);
}
return 0;
} |
WIN API
1. FILE HEADER - 파일에 대한 정보 가짐
BITMAPFILEHEADER 구조체
2. INFORMATION HEADER 실제 비트맵에 대한 세부 정보 가짐
BITMAPINFOHEADER 구조체
3. PALETTE 각 픽셀이 가지고 있는 값에 대한 실제 RGB값 저장
RGBQUAD 구조체 비트맵이 256개 이하 색상일 경우만 해당(트루컬러 비트맵인 경우 PALETTE가 없음)
4. DATA 각 픽셀의 색상값 저장되어 있음
1. BITMAPFILEHEADER 구조체
비타맵 파일에 대한 정보(파일헤드)
typedef struct tagBITMAPFILEHEADER { // 14 = 2+4+2+2+4 (byte)
WORD bfType; // "BM"이라는 글자가 설정됨
DWORD bfSize; // 비트맵 파일의 전체 크기
WORD bfReserved1; // 예약변수(0으로 설정함)
WORD bfReserved2; // 예약변수(0으로 설정함)
DWORD bfOffBits; // 파일에서 비트맵 데이터가 있는 위치
} BITMAPFILEHEADER;
파일의 형태를 지정하는 매직 넘버이며 비트맵인 경우 반드시 BM이어야 함. (0x42, 0x4d)
비트맵파일인지 아닌지를 확인하는 변수가 bfType 이다.
BMP파일의 첫 두 바이트는 항상 "BM" 문자가 저장된다.
bfOffBits 는 파일 시작부분에서 실제 영상데이터가 존재하는 위치까지 바이트 단위의
거리를 나타낸다.
WORD 는 unsigned short, DWORD 는 unsigned long 으로 정의되어 있다
2. BITMAPINFOHEADER 구조체
비트맵 영상에 대한 크기, 흑백, 칼러정보, 팔레트 크기 정보등을 저장하기 위한 구조체 변수이다
typedef struct tagBITMAPINFOHEADER { // 40 = 4+4+4+2+2+4+4+4+4+4+4 (byte)
DWORD biSize; // 구조체의 크기
LONG biWidth; // 비트맵의 가로 크기
LONG biHeight; // 비트맵의 세로 크기
WORD biPlanes; // Plane수(1로 설정함)
WORD biBitCount; // 한 픽셀당 비트수
DWORD biCompression; // 압축 유무 플래그
DWORD biSizeImage; // 그림 데이터의 크기
LONG biXPelsPerMeter; // 한 픽셀당 가로 미터
LONG biYPelsPerMeter; // 한 픽셀당 세로 미터
DWORD biClrUsed; // 그림에서 실제 사용되는 컬러 수
DWORD biClrImportant; // 중요하게 사용되는 컬러
} BITMAPINFOHEADER;
중요한 정보는 영상파일의 크기를 나타내는 변수 biHeight, biWidth 와 흑백과 칼라여부를
나타내는 biBitCount, 팔레트 크기를 나타내는 biClrUsed 등이다
biBitCount 가 8이면 흑백영상이거나 2^8 = 256 칼라의 영상이다
24라면 트루칼라, 16이면 2^16 개의 칼라를 사용하는 영상이다