본문 바로가기
C#

[C#] 컬렉션(Collection) 클래스

by RucA 2024. 4. 24.
728x90
반응형

 

배열처럼 자주 쓰이는 특정 항목의 집합을 컬렉션 또는 리스트라고 한다. 배열과 .NET에서 제공하는 컬렉션 관련 클래스들 중 특히 유용하다고 생각되는 부분만 요약 정리하겠다. 배열이 아닌 컬렉션 클래스의 경우 정적(static)이 아니기 때문에, 사용하기 위해서는 각 클래스의 인스턴스를 선언(생성)해야 한다.

 

관련 네임스페이스 : using {NAMESPACE}로 사용 자주 쓰이는 클래스
System Array
System.Collections Stack, Queue, ArrayList, Hashtable
System.Collections.Generic Stack<T>, Queue<T>, List<T>, Dictionary<T>

 

 

Array 클래스 주요 메서드


  • Array.Sort() : 배열을 정렬하기
int[] arr = {3 ,5 ,1 ,2 ,4};
Array.Sort(arr);
foreach(var v in arr)
{
	Console.WriteLine(v);
}
//출력: 1 2 3 4 5

 

  • Array.Reverse() : 배열의 역순으로 바꾸기
int[] arr = { 1, 6 ,9};
Array.Reverse(arr);
foreach(var v in arr)
{
	Console.WriteLine(v);
}
//출력 : 9 6 1

 

  • Array.ConvertAll() : 배열을 특정한 값으로 변환하기
//숫자로 된 문자열 배열을 정수형 배열로 변경하기
string[] strArr = {"11", "22", "33"};
int[] intArr = Array.ConvertAll(strArr, int.Parse);
foreach(var v in intArr)
{
	Console.WriteLine(v);
}

 

 

 

Stack 클래스 주요 메서드


주로 선입후출(FILO) 방식을 구현할 때 자주 사용한다.

 

  • Stack 클래스를 사용하기 위해 네임스페이스와 클래스의 인스턴스를 생성해야 한다.
//네임스페이스 선언
using System.Collections;

//Stack 클래스의 인스턴스 생성
Stack stack = new Stack();

 

  • stack.Count : 스택에 있는 데이터 개수 조회하기
  • stack.Push() : 스택에 데이터 저장하기
  • stack.Pop() : 스택에 데이터 꺼내기
using System.Collections;

class StackPractice
{
    static void Main()
    {
        Stack stack = new Stack();
        
        stack.Push(1);
        stack.Push(6);
        stack.Push(9);

        while (stack.Count > 0)
        {
            Console.WriteLine(stack.Pop());
        }
    }
}
//출력 9 6 1

 

  • stack.Peek() : 스택 맨 위의 데이터를 삭제하지 않고 참조하기
  • stack.Clear() : 스택 비우기
using System.Collections;

class StackPractice
{
    static void Main()
    {
        Stack stack = new Stack();
        
        stack.Push(1);
        stack.Push(6);
        stack.Push(9);
        
        //스택 카운트는 3
        Console.WriteLine(stack.Count); 
        //Peek로 가장 마지막에 넣은 9가 출력
        Console.WriteLine(stack.Peek()); 	
        
        //Peek는 스택의 요소를 제거하지 않으므로 여전히 3
        Console.WriteLine(stack.Count); 	
       	//Peek로 가장 마지막에 넣은 9가 출력
        Console.WriteLine(stack.Peek()); 	
 
        //Pop으로 가장 마지막에 넣은 9가 출력
        Console.WriteLine(stack.Pop());	
        //Pop은 제거하므로 스택 카운트가 2
        Console.WriteLine(stack.Count);		
        
        //스택을 모두 비우기
        stack.Clear();			
        //스택 카운트가 0
        Console.WriteLine(stack.Count);		
    }
}
//출력: 3 9 3 9 9 2 2 0

 

Stack 클래스가 비어있는데 Pop() 메서드를 사용하려고 할 경우, 스택언더플로우 에러가 나오니 주의하기. 반대로 너무 많은 데이터가 저장되는 경우 스택 오버플로우 에러가 나온다.

 

 

Queue 클래스 주요 메서드


주로 선입선출(FIFO) 방식을 구현할 때 자주 사용한다.

 

  • Queue 클래스를 사용하기 위해 네임스페이스와 클래스의 인스턴스를 생성해야 한다.
//네임스페이스 선언
using System.Collections;

//Queue 클래스의 인스턴스 생성
Queue queue = new Queue();

 

  • queue.Count : 스택에 있는 데이터 개수 조회하기
  • queue.Enqueue() : 스택에 데이터 저장하기
  • queue.Dequeue () : 스택에 데이터 꺼내기
using System.Collections;

class QueuePractice
{
    static void Main()
    {
        Queue queue = new Queue();
        
        queue.Enqueue(1);
        queue.Enqueue(6);
        queue.Enqueue(9);

        while (queue.Count > 0)
        {
            Console.WriteLine(queue.Dequeue());
        }
    }
}
//출력: 1 6 9

 

  • queue.Peek() : 큐 맨 앞의 데이터를 삭제하지 않고 참조하기
  • queue.Clear() : 큐 비우기
using System.Collections;

class QueuePractice
{
    static void Main()
    {
        Queue queue = new Queue();
        
        queue.Enqueue(1);
        queue.Enqueue(6);
        queue.Enqueue(9);
        
        //큐 카운트는 3
        Console.WriteLine(queue.Count); 	
        //가장 먼저 입력한 1이 출력
        Console.WriteLine(queue.Peek());	
        
        //Peek는 데이터를 제거하지 않으므로 큐 카운트는 3
        Console.WriteLine(queue.Count);	
        //가장 먼저 입력한 1이 출력
        Console.WriteLine(queue.Peek());	
        
        //가장 먼저 입력한 1이 출력
        Console.WriteLine(queue.Dequeue());	
        //Dequeue는 데이터를 제거하므로 큐 카운트는 2
        Console.WriteLine(queue.Count);		
        
        //큐를 전부 비우기
        queue.Clear();			
        //큐 카운트는 0
        Console.WriteLine(queue.Count);		
    }
}
//출력: 3 1 3 1 1 2 0

 

 

ArrayList 클래스 주요 메서드


선언 후 데이터 항목의 개수가 고정되는 배열과 달리 가변적으로 길이가 변한다.

 

  • ArrayList 클래스를 사용하기 위해 네임스페이스와 클래스의 인스턴스를 생성해야 한다.
//네임스페이스 선언
using System.Collections;

//Queue 클래스의 인스턴스 생성
ArrayList list = new ArrayList();

 

  • list.Count : 배열리스트에 있는 데이터 개수 조회하기
  • list.Add() : 배열리스트에 데이터 추가하기
  • list.Remove() : 배열리스트에 데이터 삭제하기
  • list.Clear() : 배열리스트 비우기
using System.Collections;

class ArrayListPractice
{
    static void Main()
    {
        ArrayList list = new ArrayList();
        
        //배열리스트에 데이터 추가
        list.Add("String");				
        list.Add(25);					
        list.Add(3.14f);				
        //배열리스트 카운트는 3
        Console.WriteLine(list.Count);	
        
        //배열리스트의 "String" 제거
        list.Remove("String");			
        //배열리스트 카운트는 2
        Console.WriteLine(list.Count);	
        
        //남은 2개의 데이터 출력
        foreach (var v in list)
        {
            Console.WriteLine(v);		
        }
        
        //배열리스트 전부 비우기
        list.Clear();				
        //배열리스트 카운트는 0
        Console.WriteLine(list.Count);	
    }
}

 

배열리스트의 경우 각 데이터의 자료형을 Object형으로 받아서 저장하기 때문에, 배열리스트 내의 데이터들이 위의 예제와 같이 모두 타입이 다르더라도 문제없이 저장할 수 있다. 단 속도가 느리며, 타입을 정확히 보장할 수 없는 경우 연산을 하기 어려울 수 있다. 배열리스트에도 배열처럼 정렬, 역전 등의 유용한 기능이 많지만, 다음으로 포스팅할 제네릭 타입이 더 효율적이고 안전한 방식이므로 더 자세히는 다루지 않겠다.

 

 

Hashtable 클래스 주요 메서드


키와 값으로 이루어진 해시테이블로 빠른 데이터 검색 효율 O(1) 로  대규모의 데이터 검색이 필요한 경우 사용한다.

 

  • Hashtable 클래스를 사용하기 위해 네임스페이스와 클래스의 인스턴스를 생성해야 한다.
//네임스페이스 선언
using System.Collections;

//Hashtable 클래스의 인스턴스 생성
Hashtable hash = new Hashtable();

 

  • hash.Keys : 해시테이블의 키만 저장한 곳.
  • hash["key"] : 키를 배열의 인덱스처럼 입력해 값을 얻는다.
  • hash.Count : 해시테이블에 있는 데이터 개수 조회하기 
using System.Collections;

class HashtablePractice
{
    static void Main()
    {
        Hashtable hash = new Hashtable();

        hash[1] = 1999;
        hash["해시"] = "테이블";
        hash["마지막"] = "클래스";
        
        //해시테이블 카운터는 3
		Console.WriteLine(hash.Count); 
        
        //넣은 순서대로만 진행되진 않는다
        foreach (object o in hash.Keys) 
        {
            Console.WriteLine(hash[o]); 
        }
    }
}
//출력 : 3 테이블 클래스 1999

 

 

오늘은 자주 사용되는 클래스로, 배열 클래스와 System.Collection에서 제공되는 클래스에 대해서 간략히 정리해보았다. 이 컬렉션 클래스들은 데이터들을 기본적으로 Object형으로 받아서 활용하므로 다양한 자료형이 허용된다. 다만 이는 오류나 실수에 의해 각종 연산이 꼬일 수 있고, 연산을 할때마다 형변환을 해 효율이 떨어지게 되므로, 실제로는 지정한 데이터 형식만을 다루도록 하는 "제네릭"을 사용한다. 제네릭은 다른 데이터 형식을 추가할 수 없도록 하는 형식 안정성을 지원하고, 연산 시 추가적인 형변환이 필요없다. 그러나 제네릭을 배우기 전 기본적인 중요 클래스들을 정확히 이해하고 넘어가는 것이 도움이 될 듯 하다.

728x90
반응형