수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694098
  • Today | 449
  • Yesterday | 588

1 Articles, Search for 'Collection'

  1. 2007/02/05 사용자 정의 Collection 클래스 만들기
Programming/C#2007/02/05 16:28

사용자 정의 Collection 클래스 만들기

들어가며

개발자들은 보통 임의의 객체들을 여러개 담아두기 위해 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
2007/02/05 16:28 2007/02/05 16:28
Posted by webdizen
Tags Collection
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2599

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 시스템 관리
  • Migration
  • 버퍼 오버런
  • 프렌즈
  • 뷰
  • 정보 시스템
  • Volatile
  • 김지원
  • 파이썬
  • Visual Studio 2005
  • 시스템이용률
  • RC카
  • 여자
  • 미디어
  • Access
  • Table
  • 친일파
  • 베르사유
  • 제2기숙사
  • 인덱스 재생성

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.