들어가며
개발자들은 보통 임의의 객체들을 여러개 담아두기 위해 ArrayList, Hashtable, Stack, Queue등의 클래스를 사용한다.하지만, 이러한 클래스들은 어떤 타입의 객체(object)도 담을 수 있다는 장점이자 단점을 가지고 있다.
왜 이게 단점일까? 아래의 ArrayList를 한번 살펴보자.
[ArrayList 사용예]
ArraList alString = new ArrayList(); alString.Add("박현웅"); alString.Add("아워팀즈"); alString.Add("웹디");
이러한 코드는 소스코드의 명확성과 신뢰성의 관점에서 보면, 다소 문제가 있다.
다행히도 alString이라는 객체 이름만 보고도 "아~ ArrayList고, String객체를 담은 건가 보구나~"라는 생각은 할 수 있을지 모르겠지만, 소스코드 어디선가 alString.Add(123); 와 같이 이 alStirng객체에 누군가 '숫자'를 넣으려고 해도 ArrayList는 거부하지 않는다.
수십명의 개발자가 동시에 개발을 하는 경우에는 더더욱이 혼란스러움을 초래한다. "다른 개발자가 선언해놓은 ArrayList에 어떤 타입의 객체를 넣어야만 하는지", "만약 다른 타입의 객체를 넣었을 때의 예외처리는 어떻게 해줘야하는지"... 등등 ArrayList가 모든 객체(object)를 모두 포용한다는 사실은 이러한 혼동을 야기하게 된다.
더구나, 클래스라이브러리(DLL)형태로 만들어서 배포하는경우, 제3의 개발자가 위의 alString객체를 받아와서 '도움말'없이 과연 제대로 사용할 수 있는가는 더욱 더 의문이다. 그 개발자는 "alString.Add("까지 입력한 뒤, Add메소드의 인수가 어떤 타입의 객체를 받는지 살펴볼 것이지만, ArrayList로 되어 있는 alString객체는 분명 어떤 객체타입이든 넘겨도 된다라고 알려줄 것이다.
이와 같은 이유로, DataRow와 DataRowCollecion의 한 쌍과 같이 아주 '명확한' Collection클래스를 정의한다면, 보다 프로그래밍을 신뢰있게 코딩할 수 있을 것이다.
지금까지, 사용자 정의 Collecion클래스를 정의해야 하는 이유에 대해 설명했다.
다음 단락에서는 실제 구현을 해보도록 하겠다.
구현
그럼, MyClassCollection에 담을 클래스인 MyClass를 정의해보겠다.[MyClass]
class MyClass { public MyClass() { } }
뭐 MyClass는 중요한게 아니므로, 내부 구현은 생략하였다.
그럼, 이제 본격적으로 MyClassCollection클래스를 정의해보자.
소스에 대한 설명은 주석을 참고하기 바란다.
[MyClassCollection]
/// CollectionBase 추상클래스를 상속받아 protected IList형 객체인 List에 접근하여, /// 임의의 객체를 추가/수정/삭제함으로써 사용자정의 Collection의 효과를 얻게된다. class MyClassCollection : CollectionBase { // 인덱서를 제정의. public MyClass this[int index] { get { return((MyClass)List[index]); } set { List[index] = value; } } // Add메소드 구현 public int Add(MyClass value) { return(List.Add(value)); } // IndexOf메소드 구현 public int IndexOf(MyClass value) { return(List.IndexOf(value)); } // Insert메소드 구현 public void Insert(int index, MyClass value) { List.Insert(index, value); } // Remove메소드 구현 public void Remove(MyClass value) { List.Remove( value ); } // Contains메소드 구현 public bool Contains(MyClass value) { // 만약 value가 MyClass타입이 아니면, false가 리턴된다. return(List.Contains(value)); } // 자, 이제 기본적으로 사용자 정의 Collection객체를 사용하기 위한 과정이 끝났다. // 이제, 약간 고급 로직을 살펴보겠다. // 아래는 CollectionBase의 각종 vitual메소드를 재정의한 것으로,
// 사실 구현하지 않아도 거의 문제가 없다. // 다만, 이러한 게 있다는 정도로 알아두기 바란다. // OnValidate : 유효성 검사가 필요할 때 호출되는 메소드 // (Collection에 추가/수정/삭제 등의 작업이 이뤄지기 전에 호출됨) protected override void OnValidate( Object value ) { // 기본적으로 CollectionBase클래스의 OnValidate메소드는 null여부만 판단하여 // ArgumentNullException예외를 발생한다. base.OnValidate(value); // 타입 검사하는 로직을 추가해보자. // 물론, 입력된 객체의 Type이 MyClass형이 아닌 경우 예외를 발생하도록 하였다. if (value.GetType() != Type.GetType("nsMyCollection.MyClass")) throw new ArgumentException("입력된 값이 MyClass타입이 아닙니다."); } // 위에서 구현한 OnValidate메소드 이외에도, // // OnInsert : List에 어떤 항목이 추가 또는 삽입되기 직전에 호출 // OnInsertComplete : List에 어떤 항목이 추가 또는 삽입된 직후에 호출 // OnRemove : List에서 어떤 항목이 삭제되기 직전에 호출 // OnRemoveComplete : List에서 어떤 항목이 삭제된 직후에 호출 // OnSet : List에서 어떤 항목이 수정되기 직전에 호출 // OnSetComplete : List에서 어떤 항목이 수정된 직후에 호출 // OnClear : List의 항목을 모두 삭제(Clear)되기 직전에 호출 // OnClearComplete : List의 항목을 모두 삭제(Clear)된 직후에 호출 // // 와 같은 vitual함수들을 오버라이드해서 사용 할 수 있다. // 현재 상황에선 그다지 필요가 없으므로, 구현은 생략하겠다. }
정리
지금까지 사용자 정의 Collection 클래스를 만드는 방법에 대해 알아보았다.※ 구현환경
.NET Framework 1.1
Microsoft Visual Studio.NET 2003
Microsoft Windows XP SP2
※ 필자소개
박 현 웅 (웹디)
webdy@korea.com
http://www.ourteamz.org
"C#" 카테고리의 다른 글
- 정렬된 Named Color List 만들기 (0)2007/02/05
- 여러가지 윈도우 시스템 제어 (2)2007/02/05
- 사용자 정의 Collection 클래스 만들기 (0)2007/02/05
- 도스명령 수행 프로그램을 만들어보자 (0)2007/01/25
- ListView 의 항목들을 Excel 파일로 저장하기 (0)2007/01/25
Tags Collection

수안이의 컴퓨터 연구실



Leave your greetings.