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개를 지운다는 의미 입니다.

댓글 없음: