ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CPtrList, CMapStringToPtr 클래스
    MFC 2025. 4. 3. 15:29

    MFC (Microsoft Foundation Class)

    Win32 API를 쉽게 활용 할 수 있는 지원 체계

    - Win32 API 직접 호출 가능

    - Win32 API와 혼용해 개발 가능

     

    ● C/C++ 기반 (GUI) 응용 프로그램 프레임워크

    - GUI 개발에 최적화

    - Windows XP 수준(Pentium III CPU + 256MB RAM) 환경에서도 구동 가능

     

    ● 문자열 처리, 컬렉션, 시스템 입/출력 클래스 제공

     

    ● AFX(windows Application FrameworKS)

     

    MFC에서 제공하는 컬렉션 클래스는 Array, List, Map 이있다.

    배열 (Array) CArray 동적 크기 조절 가능한 배열
    연결 리스트 (List) CList 양방향 연결 리스트
    맵 (Map) CMap 키-값(Key-Value) 형태의 데이터 저장

    Array같은 경우는 중간에 값을 넣기 쉽지않다. 

    예를들어, ABCDE 라는 값이 있는데 중간에 Z라는 값을 넣으려면 AB를 복사한 뒤, Z를 넣고, CDE를 복사하여 넣어야된다. 이렇게 되면 순간적으로 메모리를 ABCDE, ABZCDE 두개가 사용해서 메모리 사용량이 급증한다. (어차피 앞에껀 사라짐)

    포인터 배열, 문자열 배열 등이 많이 쓰인다.

    반면 연결리스트와 같은 리스트는 중간에 데이터를 넣고 빼고 하기가 쉽다.

    #define _AFXDLL
    #include <afx.h>
    #include <Afxtempl.h>

    MFC collection class 헤더 파일을 정의하면 갖다 쓸수 있다.

    CPtrList list:
    	list.AddTail((void*)"test");
        list.AddTail((void*)"string");
        list.AddTail((void*)"data");
        
        POSITION pos = list.GetHeadPosition();
        while(pos != NULL) {
    	std::cout << (char*)list.GetAt(pos) << std::endl;
        list.GetNext(pos);
    }

    먼저 CPtrList는 연결리스트 클래스이다. 

    AddTail 함수는 맨 끝에 새로운 데이터가 추가된다.

    중요한건 문자열 test가 저장되는것이 아닌, test의 주소값을 저장하기 위해(void*)를 붙인다.

    GetHeadPosition은 Head와 Tail이 아닌 첫 번째 노드 위치를 반환한다.

    반복문을 살펴보면, pos는 첫번째 노드부터 비어있지 않을때까지 반복하는데, char*를 통해 아까 문자열이 아닌 주소값을 문자열로 형변환한다. GetNext()함수를 통해 다음노드로 이동한다.

    CMapStringToPtr map;
    map.SetAt(_T("test1"), (void*)"test");
    map.SetAt(_T("test2"), (void*)“string");
    map.SetAt(_T("test3"), (void*)“data");
    void* pResult = nullptr;
    map.Lookup(_T("test2"), pResult);
    if (pResult != nullptr)
    std::cout << (char*)pResult << std::endl;

    다음으로 map을 사용하는 방식이다.

    test1, test2, test3을 키로, test, string, data의 문자열 주소를 값으로 한다.

    키 test2에 해당하는 값을 찾아서 pResult에 저장하면, string의 주소가 pResult에 저장된다.

    pResult가 비어있지않다면 char* 즉, 문자열 형태로 변환한 뒤, 출력한다는 것이다.

    여기서 특징은 LookUp함수는 해시 테이블 기반으로 동작하기 때문에 데이터 개수가 위처럼 3개가 아닌 3000개여도 빠르게 검색 가능하다. 반면 List나 Array 선형 탐색이 필요하기때문에 LookUp함수를 사용할 수 없다.

    검색이 많고 빠른 처리가 필요하면 해시기반, 데이터를 순서대로 저장한다면 CList, std::vector와 같은 선형 기반을 사용하는것을 추천한다.

     

    'MFC' 카테고리의 다른 글

    솔루션, 프로젝트, 리소스  (0) 2025.04.04
    CString 클래스와 CFile 안내  (0) 2025.04.04
    MBCS와 유니코드  (0) 2025.04.03
    Win32 API 기본 로직  (0) 2025.04.01
    Mesasage Driven 구조  (0) 2025.04.01
Designed by Tistory.