CAFE

C# 학습

[스크랩] [21기 김종현] C# Collection

작성자21기 김종현|작성시간11.05.26|조회수350 목록 댓글 0

컬렉션

작성자 : 김종현

작성일 : 2011-05-19

주 제 : C# 컬렉션 Study

 

◎ 컬렉션 클래스

- 데이터의 저장과 검색을 위해 특화된 클래스를 의미한다.

- 해쉬 테이블, 스택, 사전, List 등이 있다.

- 대부분 공통적인 인터페이스를 구현함으로써 일관적인 방법으로 사용할 수 있다.

- 상속을 통해 특수화된 컬렉션 클래스를 구현하는 것이 가능하다.

- 제네릭 컬렉션 클래스도 제공함으로써, 값 형식 보관 시에 발생하는 오버헤드를 줄여서 성능 개선을 할 수 있다.

 

◎ 컬렉션 클래스의 종류

 

이 름

기 능

Array

배열의 기본 클래스. 시스템과 컴파일러만 명시적으로 파생할 수 있다. 배열을 관리함에 있어서 강력한 기능들을 제공하고 있다.

ArrayList

List

컨테이너 용량을 필요에 따라 자동으로 확장을 하는 클래스로 확장된 배열이라 할 수 있다.

Hashtable Dictionary

컬렉션의 요소로 키와 값을 쌍으로 받아 빠른 검색을 보장해준다.

SortedList SortedDictionary

콜렉션 내의 요소들을 키 순으로 정렬된 상태를 유지한다.

Queue

선입선출 방식으로 요소를 보관한다.

Stack

후입선출 방식으로 요소를 보관한다.

HashSet

합집합, 교집합, 차집합 등의 작업을 할 수 있다.

 

  

◎ 컬렉션 사용 예제

 

- Sort의 사용 예제.

 

class Program

{

static void Main(string[] args)

{

int[] arr = new int[10];

Random rand = new Random();

for (int i = 0; i < arr.Length; i++)

{

arr[i] = rand.Next(100);

}

Console.WriteLine("정렬 전");

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

Console.WriteLine(" : {0} ", arr.Length);

Array.Sort(arr);

Console.WriteLine("\n\n정렬 후");

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

Console.WriteLine(" : {0} ", arr.Length);

}

}

Array 클래스의 정적 메서드인 sort의 사용 방법과 sort를 이용해서 정렬하기 전과 정렬 이후의 차이를 나타낸 결과이다. 주의해야 할 점은 모든 배열이 sort로 정렬이 가능한 것은 아니다. 배열의 요소가 IComparable한 인터페이스에 대한 구현이 이루어진 경우에 한에서만 sort 메서드가 사용가능하다. 기본형식의 경우는 IComparable로 구현이 되어 있다.

 

- 제공하는 인터페이스들의 구현약속.

 

class Stu : IComparable

{

int num;

string name;

public string Name

{

get

{

return name;

}

}

public Stu(int _num, string _name)

{

num = _num;

name = _name;

}

public override string ToString()

{

return string.Format("번호 : {0} 이름 : {1}", num, name);

}

}

IComparable을 상속 받는 클래스 Stu를 만들어준다. 이름과 번호 필드를 만들어 주고 이름을 받을 수 있게 속성을 하나 만들어 준다. 생성자로 초기화하는 것을 잊지 않도록 한다. ToString을 재정의해서 화면에 어떻게 출력되게 할지 정한다. IComparable을 상속 받지 않으면 예외가 발생하기 때문에 상속을 받도록 한다.

int IComparable.CompareTo(object obj)

{

Stu s = obj as Stu;

if (s == null)

{

throw new Exception("입력 인자로 Stu 형식의 개체 인스턴스가 오지 않았습니다.");

}

return num - s.num;

}

 

Stu 클래스에 IComparable 인터페이스를 명시적으로 구현한다. 이렇게 하면 번호순으로 정렬이 된다. 이름 순으로 정렬하고 싶다면 Helper Class를 만들어서 구현한다.

class Helper : IComparer

{

int IComparer.Compare(object x, object y)

{

Stu s1 = x as Stu;

Stu s2 = y as Stu;

if ((s1 == null) || (s2 == null))

{

throw new Exception("입력 인자로 Stu 형식의 개체 인스턴스가 오지 않았습니다.");

}

return s1.Name.CompareTo(s2.Name);

}

}

IComparer를 구현약속 하고, 명시적으로 구현을 해준다. 2개의 인자가 전부 Stu 형식이 맞는지 as 연산자를 이용해서 확인한다. 2개의 인자가 전부 null이 아닐 경우에만 비교를 하도록 만들어 준다.

Sort를 이용해서 번호순과 이름순으로 정렬한 결과의 모습이다.

 

- ArrayList의 사용 예제.

 

class Program

{

static void Main(string[] args)

{

ArrayList arr = new ArrayList();

arr.Add(1);

arr.Add(9);

arr.Add(3);

arr.Add(5);

arr.Add(7);

Console.WriteLine("입력순서대로 정렬");

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

arr.Sort();

Console.WriteLine("순차적으로 정렬");

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

Console.WriteLine("특정 숫자를 제거");

arr.Remove(7);

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

Console.WriteLine("역방향으로 정렬");

arr.Reverse();

foreach (int i in arr)

{

Console.WriteLine(i.ToString());

}

int j;

Console.WriteLine("숫자를 입력하세요");

Console.WriteLine("숫자검색하기");

j = int.Parse(Console.ReadLine());               

if (arr.Contains(j) == true)

{

Console.WriteLine("있어");

}

else

{

Console.WriteLine("없어");

}           

}

}

ArrayList에는 다양한 멤버들을 제공하고 있다. 다양하게 활용해 보도록 하자. ArrayList는 기본적으로 입력된 순서대로 정렬되게 된다. Sort(), Reverse(), Remove(), Contain() 등을 이용해서 정렬을 다양하게 활용하고, 삭제, 검색 등을 할 수 있다.

다양한 정렬의 활용, 제거, 검색의 ArrayList의 멤버를 활용한 결과다.

 

    - Boxing, Unboxing으로 생기는 오버헤드를 줄이기 위한 제네릭 컬레션 사용 예제

 

                                                    

ArrayList arr = new ArrayList();  List<int> arr = new List<int>();

ArrayList List<int>와 같은 형식으로 바꿔주면 된다.사용 방법은 모두 동일하다. 성능이 요구되는 프로그램 제작 시에는 Generic Collection을 사용하는 것이 좋다.

 

다음검색
스크랩 원문 : 선문비트프로젝트
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼