home > working > C/C++ > Source, Tip

 


Name  
   조규남 
Subject  
   [강좌] How to use C++ in MFC No.3 Templet
[3차] Templet

드디어 작업씨 첫 번째 강좌 세번째 시간입니다. 두번째 강좌는 너무 정신 없이 쓴 것이라서 여러분들이 이해나 하셨는지 궁금하군요 -_-; 조망간 다시 정리를 해야 할 듯 합니다. 지난 번 강좌 주제는 주제가 주제이니 만큼 복잡했지만 이번 강좌는 간당 명료 합니다.
이번 강좌는 템플릿에 관한 것입니다. 필자도 템플릿을 통한 프로그래밍(템플릿으로 구현하는 코드)을 시도는 몇 번 해봤지만 번번히 실패했다. 유연성 높은 프로그래밍이랑 어려운 것이다 -_-; 지도 못짜는 주제에 왠 강좌야 라고 욕하는 저 뒤에분 ㅡ,.ㅡ; 이 강좌는 MFC에서 템플릿이 어떻게 쓰였는가 이다. 작성이 아니란 말이다. 필자는 CArray를 자주 사용한다. CList나 CPtrList도 있긴 하지만 POSITION으로 뺑뺑이를 돌아야 하는 귀찮음은 필자로 하여금 CArray를 사랑하게 만들었다.
눈치 빠른 사람은 알 것이다. 오늘 강좌는 CArray로 진행을 할 것이다. CArray는 동적 배열이다. 보통의 Array와는 다르게 크기가 자유자재로 변한다. new와 delete와 메모리 장난의 극치이다. 자신이 만들어서 쓸 수도 있다. 그리 어렵진 않다. 하지만! 필요로 하는 자료형이 매번 바뀌기 때문에 코드를 짜 놓는다고 해도 다시 써야 할 때는 자료형을 변경해주어야 한다. 물론 매크로로 자료형을 만들어서 간단히 다시 사용할 수도 있다. 하지만 MS 고급 프로그래머들이 잘 만들어 놓은걸 다시 짤 필요가 없다고 생각한다. 있다고 생각하면 짜서 쓰시라 -_-;
다시 한 번 얘기 하자만 자료형이 변하는 동적 Array를 만들어야 재사용성이 높은 것이다. 그래서! 템플릿이 있는 것이다. 템플릿 사용법을 모른다면 책이나 웹사이트를 참고 하기 바란다. 훌륭한 책과 웹사이트가 많다.

이번 강좌는 CArray를 통해서 템플릿이 어떻게 사용되는지 알아 보도록 한다. 왜 사용하는지는 위에서 언급하였다.
우선 CArray의 Class 선언을 살펴 보자.

template<class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject
{
public:
// Construction
        CArray();

// 이하 생략
};

TYPE과 ARG_TYPE을 사용해서 자료형에 상관 없는 동적 배열을 구현하였다. 보다 자세한 Class 선언은 "afxtempl.h"를 참고 하기 바란다. 어디 있는지 모르는 사람은 탐색기의 찾기 기능을 이용해 보도록 하자.
TYPE을 CArray의 자료형으로 사용하기 위한 코드이다. 객체를 생성할 때

CArray<char, char> arrayObj;

이렇게 사용한다. 이렇게 객체를 생성하면 arrayObj는 char를 가지고 동적 배열을 구성한다. 이후로는 arrayObj에 char 를 넣었다 뺐다 할 수 있다. 이때 사용하는 char 대신 다른 모든 자료형을 사용할 수 있고, 사용자가 정의한 클래스나 MFC에서 사용하는 클래스도 역시 사용할 수 있다. CString도 사용가능 하나 참아보자. CString은 우리를 즐겁게 해주기 위해서 오동작을 하지 않는가? 자신이 만든 클래스가 CArray에서 사용되기 위해서는 sizeof 같은 몇가지 연산자를 오버로딩해주어야 한다. 어떤 것들을 오버로딩해야 하는지는 헤더파일을 보면 쉽게 찾을 수 있을 것이다.
이렇게 자료형의 제한이 없기 때문에 리스트를 손으로 작성해야 하는 수고를 CArray가 덜어 준다. 프로그래머는 이후로

arrayObj.Add('c')
char t = arrayObj.GetAt(0);

이런 코드를 사용할 수 있다. 그렇다면 내부에서 어떤 일이 벌어 지길래 이런 것들이 가능한지 살펴 보자. 다음 코드는 멤버 함수인 SetSize 코드의 일부이다.

m_pData = (TYPE*) new BYTE[(size_t)nAllocSize * sizeof(TYPE)];
memset((void*)m_pData, 0, (size_t)nAllocSize * sizeof(TYPE));

m_pData는 CArray에서 관리하는 동적 배열이다. 코드에서 보는 봐와 같이 TYPE을 사용해서 sizeof도 가능하고 Type casting도 가능하다. 이것이 템플릿의 강력함이다. 템플릿을 사용해서 코딩을 할 때 사용자가 어떤 자료형을 입력할지는 전혀 걱정할 필요가 없다. 나는 TYPE이라는 것만을 가지고 코딩을 하면 된다.
MFC에서 CArray를 사용하기 위해서는 이것들만 알고 있으면 된다. 굉장히 간단하다. 유연성도 높다. 구지 이해 안가는 템플릿을 이해하기 위해서 책장을 앞뒤고 넘기지 않고도 템플릿을 사용할 수 있다. 사실 템플릿을 사용하기 위해서도 이것만 알고 있으면 된다. 그러는 당신은 왜 못하냐구 -_-; 문법은 쉬운데 그걸 활용해서 유연성 높은 프로그래밍을 하는건 그리 쉽지 않다. 여러분은 성공 하길 바란다.


Name Memo Password  
        


Prev
   ODBC를 이용하지 않고 MS SQL에 접속해서 데이터 얻어 오는 방법 [1]

조규남
Next
   [dante tip#1] 인터넷 현재 상태 온라인인지 오프라인인지 확인하기 [6]

이상수


Copyright 1999-2018 Zeroboard / skin by JiYoo / edit by Mystous