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.0725 sec