배열처럼 자주 쓰이는 특정 항목의 집합을 컬렉션 또는 리스트라고 한다. 배열과 .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형으로 받아서 활용하므로 다양한 자료형이 허용된다. 다만 이는 오류나 실수에 의해 각종 연산이 꼬일 수 있고, 연산을 할때마다 형변환을 해 효율이 떨어지게 되므로, 실제로는 지정한 데이터 형식만을 다루도록 하는 "제네릭"을 사용한다. 제네릭은 다른 데이터 형식을 추가할 수 없도록 하는 형식 안정성을 지원하고, 연산 시 추가적인 형변환이 필요없다. 그러나 제네릭을 배우기 전 기본적인 중요 클래스들을 정확히 이해하고 넘어가는 것이 도움이 될 듯 하다.
'C#' 카테고리의 다른 글
[C#] 대리자(Delegate; 델리게이트)와 무명 메서드(+람다식 기초) (1) | 2024.04.26 |
---|---|
[C#] 참조 매개 변수, ref와 out의 차이점 (0) | 2024.04.25 |
[C#] 값 형식과 참조 형식, 박싱과 언박싱(힙 메모리), is 연산자와 as 연산자 (0) | 2024.04.25 |
[C#] 다차원 배열과 가변 배열(C/C++ 문법과 차이점) (0) | 2024.04.25 |
[C#] 널(NULL) 관련 형식[Nullable<T>] 및 연산자[??, ?.] (1) | 2024.04.24 |
[C#] 제네릭(Generic) 클래스 (0) | 2024.04.24 |
[C#] Rider 내 실습용 콘솔 솔루션 생성 & 유용한 문자열 형식, 표기법 (1) | 2024.04.23 |
[C#] 초기 개발 환경 설정(Rider) 및 유니티 연동 + SDK 8.0 설치 (0) | 2024.04.23 |