2019년 11월 6일 수요일

MFC CArray 활용법

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

CArray 는 가변 리스트 배열을 관리 하는 클래스 입니다.

CArray<DataType, ARG_TYPE> variable; 과 같이 선언 하여 씁니다.

특이한점은 ARG_TYPE 이 하나 더 존재 하는것인데요.

이것은 쉽게 이야기 하면.

CArray<int, int> arrTest; 라고 선언을 하게 되면

arrTest 에 int 값을 추가 하고 값을 얻어 갈때 값을 복사해서 전달하는 구조입니다.

CArray<int, int&> arrTest; 라고 선언을 하게 되면

arrTest 에 int 값을 추가 하고 값을 얻어 갈때 값의 참조 포인터를 전달하는 구조입니다.

두번째 것을 써야 실제로 멤버를 얻은후 값을 변경하면 바로 적용이 가능합니다.

간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 operator / GetAt 을 이용하는 방법을 샘플에 적용하여 만들어 보겠습니다.


CArray<int, int&> arrTest;

for (int i=0; i<100; i++)
{
 arrTest.Add(i);
}

//operator [] 이용하여 멤버 접근.
for (int i=0; i<arrTest.GetCount(); i++)
{
 TRACE(_T("operator arrTest[%d]=[%d]\n"), i, arrTest[i]);
}

//GetAt 이용하여 멤버 접근
for (int i = 0; i < arrTest.GetCount(); i++)
{
 TRACE(_T("GetAt arrTest.GetAt(%d)=[%d]\n"), i, arrTest.GetAt(i));
}
< 위 코드는 Visual Studio 2019 Community 에서 빌드 되었습니다 >

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

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

​a. Add : CArray 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. GetCount : CArray 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. RemoveAll : CArray 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. RemoveAt : CArray 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. InsertAt : ArrayList 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. GetAt : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. SetAt : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.

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


CArray<int, int&> arrTest;

for (int i = 0; i < 100; i++)
{
 arrTest.Add(i);
}

//추가된 멤버의 갯수 출력.
TRACE(_T("arrTest Count : %d\n"), arrTest.GetCount());

//20번쨰 위치에 200 엠버 추가.
int nInsert = 200;
arrTest.InsertAt(20, nInsert, 1);

TRACE(_T("arrTest Count : %d, arrTest[20]=%d\n"), arrTest.GetCount(), arrTest.GetAt(20));

//20번째 삽입한 200 멤버 제거.
arrTest.RemoveAt(20, 1);

TRACE(_T("arrTest Count : %d, arrTest[20]=%d\n"), arrTest.GetCount(), arrTest.GetAt(20));
 
//50 ~ 100 멤버 삭제.
arrTest.RemoveAt(50, 50);

TRACE(_T("arrTest Count : %d\n"), arrTest.GetCount());
for (int i=0; i<arrTest.GetCount(); i++)
{
 TRACE(_T("arrTest[%d] Member [%d]\n"), i, arrTest[i]);
}

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

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

위코드중에 중간 삽입시 arrTest 두번째 파라메터가 int& 이걸로 정의가 되어 있기 때문에 일반 상수 즉 200 값을 바로 넣을수 없구 멤버 변수에 값을 할당하여 추가 해야 합니다.

구간 삭제는 50번째 부터 50개를 지운다는 의미 입니다.

댓글 없음: