U E D R , A S I H C RSS

MFC/Collection Class

{{| |}}

1. Collection Class

컬렉션(Collection)은 특별한 방식으로 구성되어 있는 임의 개수의 데이터 항목의 집합을 뜻한다.
MFC에서 제공하는 컬렉션을 다루는 클래스는 그 형태에 따라서 크게 3가지로 구분할 수 있다.
Array 순서가 매겨진 요소들의 집합. 정수 색인값을 통해 접근가능함. 배열 컬렉션의 크기가 유동적이나, 속도가 느린단점이 있다.
List 순서가 있는 데이터 항목의 집합. Doubly-linked list 로 구현되어 있다. 데이터의 삽입, 삭제가 빠르지만 하나하나의 데이터를 검색하는 속도는 느리다.
Map 순서가 없는 데이터 항목의 집합. 키값을 통해서 각각의 컬렉션에 접근한다. 데이터의 검색에 유용하다. 그렇지만 순차적인 접근이 필요한 곳에서는 배열이 더 좋다.
두가지 형태로 구현되어있다. 첫번째는 함수템플릿을 이용한 형태로 구현되어있고, 두번째는 템플릿을 사용하지 않는 방법으로 옛 버전의 VC++에서 부터 사용되어온 방식이다. 현재는 템플릿을 이용한 방법을 사용하는 것이 좋다.

2. type-safe collection class

객체들의 컬렉션은 CArray, CList, CMap 템플릿 클래스들에 의해서 지원된다. 객체 포인터의 컬렉션은 ~cpp CTypedPtrArray, CTypedPtrList, CTypedPtrMap 클래스들에 의해서 지원된다.

객체의 컬렉션을 정의하는 템플릿 클래스는 MFC의 CObject클래스에서 파생된다. 이런 템플릿 클래스는 기본 데이터 형식이나 사용자가 정의한 클래스, 구조체를 포함한 어떠한 종류의 객체도 저장, 관리하는 것이 가능하다. 이런 클래스들은 내부적으로 복사를 하기 때문에 복사생성자를 만들어야 한다.

3. Template Collection Class

3.1. CArray


~cpp CArray<ObjectType, ObjectType&> anArray
CArray<저장될 객체의 형식, 사용되는 인수의 형식> anArray
첫번째 타입 인자는 저장될 요소의 타입을 말하며, 두번째 인자는 멤버함수가 사용하게될 인자를 말한다.
~cpp SetSize() 배열의 초기 개수를 지정한다. 지정하지 않아도 동작하지만 어느정도의 값을 예측해서 주면, 불필요한 매모리 재할당의 작업이 줄어들 수 있다.
~cpp Add(ObjectType) 특정 객체를 배열에 저장한다.
~cpp GetAt(index) 인덱스로 지정된 배열의 객체를 리턴한다.
~cpp operator[index] GetAt()과 동일하게 작동하며, built-in 배열과 동일한 사용법을 제공한다.
~cpp pointArray.SetAt(3, NewPoint)
~cpp pointArray[3]=NewPoint
~cpp Append() 인자로 전달된 배열을 배열의 끝 부분에 추가한다.
~cpp InsertAt() 인자로 전달된 객체를 배열의 특정 인덱스에 삽입한다.
~cpp ConstructElements(), DestructElements() 보조함수들은 객체를 삽입, 삭제하는 과정에서 쓰이는 보조 함수들이다.

3.2. CList


~cpp CList<ObjectType, ObjectType&> aList
CList<저장될 객체의 형식, 사용되는 인수의 형식> aList
첫번째 타입 인자는 저장될 요소의 타입을 말하며, 두번째 인자는 멤버함수가 사용하게될 인자를 말한다.
두번ㅤㅉㅒㅤ 인자로쓰이는 참조형은 포인터형이나 일반 객체 타입으로 바꾸는 것도 가능하며, 이것은 프로그래머의 의도에 따라 다르다.
~cpp AddHead() 리스트의 첫번째 요소에 객체를 추가한다.
리턴형은 POSITION이다.
~cpp AddTail() 리스트의 마지막 요소에 객체를 추가한다.
리턴형은 POSITION이다.
~cpp GetNext(POSITION) 전달된 위치 변수를 증가시킨다. 마지막 객체에서 사용될때에는 NULL을 리턴한다.
~cpp GetPrev() 알아서 =.=;;
~cpp InsertBefore(POSITION, ObjectType) 두번째 인자의 객체를 첫번째 인자의 위치의 앞부분에 삽입한다.
~cpp InsertAfter(POSITION, ObjectType) 알아서 =.=;;
~cpp SetAt(POSITION, ObjectType) 첫번째 인자의 위치에 두번재 인자의 객체를 할당한다. POSITION 의 유효성을 검사한후에 사용해야한다.
~cpp GetHeadPosition() 리스트의 맨 처음에대한 POSITION값을 리턴한다.
~cpp GetTailPosition() 리스트의 맨 마지막에대한 POSITION값을 리턴한다.
~cpp GetAt() 특정 위치의 객체를 리턴한다.
~cpp Find(ObjectType) 인자로 받은 객체를 검색해서 그 위치의 POSITION값을 리턴한다. 어드레스 수준에서 비교가 행해진다.
~cpp FindIndex() 인자로 받은 int 형의 색인값을 기준으로 그곳의 POSITION 형태의 값을 리턴한다. 최초 요소는 인덱스 0을 갖는다.
~cpp GetCount() 리스트에 있는 요소의 개수를 리턴한다.
~cpp RemoveHead() 리스트의 가장 윗 요소 삭제
~cpp RemoveTail() 리스트의 가장 마지막 요소 삭제
~cpp IsEmpty() 리스트가 비어있는지 검사
~cpp RemoveAt(POSITION) 특정위치의 리스트 요소를 삭제
~cpp RemoveAll() 리스트안에 있는 요소들에게 할당되었떤 메모리를 해제한다.

~cpp ConstructElements(), DestructElements(), CompareElements() 보조함수들은 객체를 삽입, 삭제, 검색하는 과정에서 쓰이는 보조 함수들이다.

3.3. CMap


~cpp CMap<KeyType, KeyType&, ObjectType, ObjectType&> aMap
CMap<키 형식, 키 인수 형식, 저장될 객체의 형식, 사용되는 인수의 형식> aMap
맵은 객체와 키의 조합을 저장한다. 키는 맵에 할당된 메모리의 특정 블록안에 객체가 저장되어 있는지를 결정하는데 사용된다. 키를 맵안의 엔트리의 어드레스로 계산될 수 있는 정소로 변환하는 과정을 해실(Hashing)이라고 한다.
해싱과정은 해시값이라는 정수를 생성한다. 일반적으로 키와 그리고 연된 객체를 맵안의 어디에 저장할 것인가를 결정하기 위해서 기본 어드레스에 대한 offset 으로 해시갑이 설정된다.

해시과정에서 키가 독특한 자신만의 해시값을 갖지 못하는 경우도 존재한다. 이 경우 객체는 다른 요소또는 이전에 해시되어 동일한 값으로 저장된 객체와 링크된다.
~cpp Lookup() 지정된 키에 해당하는 객체를 검색한다.
~cpp operator[] 배열과 동일한 형태로 사용하는 것이 가능

3.4. CTypedPtrList


~cpp CTypedPtrList<BaseClass, Type*> ListName
첫번째 인자는 기본 포인터 리스트 클래스인 CObList, CPtrList중에서 선택. CObList는 CObject의 파생 클래스를, CPtrList는 void*형의 포인터들의 리스트를 지원한다.
제공되는 멤버 함수들은 CList에 의해서 제공되는 것들과 거의 비슷하며, 연산이 포인터에 대해서 행해진다는 것은 다른 점이다.
~cpp GetHead() 리스트의 가장 앞에있는 포인터를 리턴. IsEmpty() 검사 필요.
~cpp GetTail() 리스트의 끝에 존재하는 포인터를 리턴. IsEmpty() 검사 필요.
~cpp RemoveHead() 리스트의 가장 앞에 있는 포인터를 삭제. IsEmpty() 검사 필요.
~cpp RemoveTail() 리스트의 가장 끝에 있는 포인터를 삭제. IsEmpty() 검사 필요.
~cpp GetNext(POSITION) 레퍼런스 인수로 전달된 POSITION형식의 변수가 가ㅤㄹㅣㅋ미는 위치에 있는 포인터를 리턴한다. 끝에 도달하면 POSITION은 NULL로 할당.
~cpp GetPrev() 알아서 =.=;;
~cpp GetAt() 특정 위치의 객체를 리턴한다.

CTypedPtrList의 기본 클래스인 CObList로 부터 상속받은 것들
~cpp AddHead() 리스트의 첫번째 요소에 객체를 추가한다.
리턴형은 POSITION이다.
~cpp AddTail() 리스트의 마지막 요소에 객체를 추가한다.
리턴형은 POSITION이다.
~cpp RemoveAll() 리스트안에 있는 요소들에게 할당되었떤 메모리를 해제한다.
~cpp GetHeadPosition() 리스트의 맨 처음에대한 POSITION값을 리턴한다.
~cpp GetTailPosition() 리스트의 맨 마지막에대한 POSITION값을 리턴한다.
~cpp SetAt(POSITION, ObjectType) 첫번째 인자의 위치에 두번재 인자의 객체를 할당한다. POSITION 의 유효성을 검사한후에 사용해야한다.
~cpp RemoveAt(POSITION) 특정위치의 리스트 요소를 삭제
~cpp InsertBefore(POSITION, ObjectType) 두번째 인자의 객체를 첫번째 인자의 위치의 앞부분에 삽입한다.
~cpp InsertAfter(POSITION, ObjectType) 알아서 =.=;;
~cpp Find(ObjectType) 인자로 받은 객체를 검색해서 그 위치의 POSITION값을 리턴한다. 어드레스 수준에서 비교가 행해진다.
~cpp FindIndex() 인자로 받은 int 형의 색인값을 기준으로 그곳의 POSITION 형태의 값을 리턴한다. 최초 요소는 인덱스 0을 갖는다.
~cpp GetCount() 리스트에 있는 요소의 개수를 리턴한다.
~cpp IsEmpty() 리스트가 비어있는지 검사

4. Talk

  • 내 개인적인 소견으로는 STL이 더 쓰기에 편해보인다. ㅡ.ㅡ; 단지 MFC에 최적화된어서 만들어진 만큼 MFC안에만 존재하는 장점이 있을뿐이다. Serialize 같은거? - eternalbleu

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:41
Processing time 0.0621 sec