2019년 11월 8일 금요일

MFC CMap 활용법

오늘 포스팅 할 내용은 MFC 에서 주로 쓰이는 CMap 활용법에 대한 강좌 입니다.

CMap key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

CMap<class Key, class ARG_KEY, class Value, class ARG_VALUE> variable; 과 같이 선언 하여 씁니다.

ARG_KEY, ARG_VALUE 는 이전에 CArray 강의 내용에서 알려드린 내용과 동일합니다. 이전 강의 참조 하시면 됩니다.
https://ansur.blogspot.com/2019/11/mfc-carray.html

간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


CMap<CString, LPCTSTR, int, int&> mapAlphaASCII;

//값 할당.
for (int i = 65; i <= 90; i++)
{
 CString sKey;
 sKey.Format(_T("%c"), i);

 mapAlphaASCII.SetAt(sKey, i);
}

//값 출력..
POSITION pos = mapAlphaASCII.GetStartPosition();
CString sKey;
int nValue;
while (pos)
{
 mapAlphaASCII.GetNextAssoc(pos, sKey, nValue);
 TRACE(_T("key[%s] value[%d]\n"), sKey, nValue);
}
< 위 코드는 Visual Studio 2019 Community 에서 빌드 되었습니다 >

코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다. Key가 CString 이기 때문에 저장된 초기 위치를 얻어와서 다음 멤버가 있을떄까지 루프를 돌면서 멤버를 출력합니다.

초기 CMap 선언시에 두번쨰 ARG_KEY 타입을 CString 이 아닌 LPCTSTR 로 선언을 하였습니다.

이유는 키의 참조형 변수 인데 이건 내부적으로 키값을 접근할때 객체를 직접 접근 할수 있는 일반 타입으로 선언이 되어야 합니다.

CMap 관련 상세한 인터페이스는 https://docs.microsoft.com/en-us/cpp/mfc/reference/cmap-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(AFXTEMPL%2FCMap);k(CMap);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

a. SetAt : CMap 에 멤버를 추가 해주는 메소드 입니다.
b. GetCount/GetSize : CMap 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. RemoveAll : CMap 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. RemoveKey : CMap 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. GetStartPosition : POSITION 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.
f. GetNextAssoc : POSITION 를 이용하는 방식을 이용할때 현재 위치에서 다음 지시하는 멤버를 리턴합니다.
g. Lookup : 특정 키에 해당하는 값을 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


CMap<CString, LPCTSTR, int, int&> mapAlphaASCII;

//값 할당.
for (int i = 65; i <= 90; i++)
{
 CString sKey;
 sKey.Format(_T("%c"), i);

 mapAlphaASCII.SetAt(sKey, i);
}

TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetCount());

//POSITION 값 출력..
POSITION pos = mapAlphaASCII.GetStartPosition();
CString sKey;
int nValue;
while (pos)
{
 mapAlphaASCII.GetNextAssoc(pos, sKey, nValue);
 TRACE(_T("key[%s] value[%d]\n"), sKey, nValue);
}

// B 값을 찾아 삭제.
int nFindValue;
if (mapAlphaASCII.Lookup(_T("B"), nFindValue))
{
 if (mapAlphaASCII.RemoveKey(_T("B")))
  TRACE(_T("\"B\" is Deleted.\n"));
 else
  TRACE(_T("\"B\" is Not Deleted.\n"));
}
else
 TRACE(_T("Not Found B\n"));
 
TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetSize());

//전체 멤버 삭제.
mapAlphaASCII.RemoveAll();

TRACE(_T("mapAlphaASCII Member Count: %d\n"), mapAlphaASCII.GetCount());
CMap 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

댓글 없음: