2023.02.23 - [C# 프로그래밍] - [C#] 컬렉션
바로 전 게시물에서는 컬렉션에 대해 적어봤습니다.
이때 소개한 컬렉션 클래스들은 모두 object 형식을 기반으로 했습니다.
어떤 형식이든 간에 object 형식으로 상속받고 있으므로 object 형식으로 형식 변환이 가능합니다.
컬렉션들은 바로 이 점을 이용해서 만들어진 자료 구조입니다.
이들 컬렉션은 object 형식에 기반하고 있기 때문에 태생적으로 성능 문제를 안고 있습니다.
컬렉션의 요소에 접근할 때마다 형식 변환이 주구창창 일어나기 때문입니다.
일반화 컬렉션은 이런 문제를 해결하였습니다.
일반화 컬렉션은 일반화에 기반하여 만들어져 있기 때문에 컴파일할 때 컬렉션이 사용할 형식이 결정되고, 쓸데없는 형식 변환을 일으키지 않습니다.
또한, 잘못된 형식의 객체를 담게 될 위험도 아울러 피할 수 있습니다.
그중 대표적인 네 가지 정도 클래스만 소개하겠습니다.
- List<T>
- Queue<T>
- Stack<T>
- Dictionary<TKey, TValue>
위 네 가지는 전 게시물에서 소개한 ArrayList, Queue, Stack, Hashtable의 일반화 버전입니다.
1. List<T>
제가 제일 좋아하고 많이 쓰는 타입이 나왔네요.
List<T> 클래스는 형식 매개 변수로 입력한 형식 외에는 입력을 허용하지 않는 점만 빼면 비일반화 클래스인 ArrayList와 같은 기능을 하며, 사용법 역시 동일합니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int>();
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);
Console.WriteLine("Count: " + numbers.Count);
foreach (int num in numbers)
{
Console.WriteLine(num);
}
numbers.RemoveAt(1);
Console.WriteLine("Count: " + numbers.Count);
foreach (int num in numbers)
{
Console.WriteLine(num);
}
}
}
위 예제에서는 int형 값만 저장하는 List를 생성하고, Add 메서드를 사용하여 요소를 추가합니다. Count 속성을 사용하여 요소 개수를 출력하고, foreach 루프를 사용하여 모든 요소를 출력합니다. 이후 RemoveAt 메서드를 사용하여 인덱스 1의 요소를 삭제하고, 다시 Count 속성과 foreach 루프를 사용하여 요소 개수와 모든 요소를 출력합니다.
2. Queue<T>
형식 매개 변수를 요구한다는 점만 빼고 비일반화 클래스인 Queue와 같습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue("Apple");
queue.Enqueue("Banana");
queue.Enqueue("Cherry");
Console.WriteLine("Count: " + queue.Count);
foreach (string fruit in queue)
{
Console.WriteLine(fruit);
}
string item = queue.Dequeue();
Console.WriteLine("Dequeued item: " + item);
Console.WriteLine("Count: " + queue.Count);
foreach (string fruit in queue)
{
Console.WriteLine(fruit);
}
}
}
위 예제에서는 string형 값을 저장하는 Queue를 생성하고, Enqueue 메서드를 사용하여 요소를 추가합니다. Count 속성을 사용하여 요소 개수를 출력하고, foreach 루프를 사용하여 모든 요소를 출력합니다. 이후 Dequeue 메서드를 사용하여 가장 먼저 추가된 요소를 제거하고, Dequeued item을 출력합니다. 다시 Count 속성과 foreach 루프를 사용하여 요소 개수와 모든 요소를 출력합니다.
3. Stack<T>
형식 매개 변수를 요구한다는 점만 빼고 비일반화 클래스인 Stack와 같습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Stack<int> stack = new Stack<int>();
stack.Push(10);
stack.Push(20);
stack.Push(30);
Console.WriteLine("Count: " + stack.Count);
foreach (int value in stack)
{
Console.WriteLine(value);
}
int popValue = stack.Pop();
Console.WriteLine("Popped item: " + popValue);
Console.WriteLine("Count: " + stack.Count);
foreach (int value in stack)
{
Console.WriteLine(value);
}
}
}
위 예제에서는 int형 값을 저장하는 Stack을 생성하고, Push 메서드를 사용하여 요소를 추가합니다. Count 속성을 사용하여 요소 개수를 출력하고, foreach 루프를 사용하여 모든 요소를 출력합니다. 이후 Pop 메서드를 사용하여 가장 최근에 추가된 요소를 제거하고, Popped item을 출력합니다. 다시 Count 속성과 foreach 루프를 사용하여 요소 개수와 모든 요소를 출력합니다.
4. Dictionary<TKey, TValue>
형식 매개 변수를 두 개 요구한다는 점만 빼고 비일반화 클래스인 Hashtable와 같습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("One", 1);
dictionary.Add("Two", 2);
dictionary.Add("Three", 3);
Console.WriteLine("Count: " + dictionary.Count);
foreach (KeyValuePair<string, int> item in dictionary)
{
Console.WriteLine(item.Key + " = " + item.Value);
}
int value;
if (dictionary.TryGetValue("One", out value))
{
Console.WriteLine("Value of One: " + value);
}
else
{
Console.WriteLine("Key not found");
}
dictionary.Remove("Two");
Console.WriteLine("Count: " + dictionary.Count);
foreach (KeyValuePair<string, int> item in dictionary)
{
Console.WriteLine(item.Key + " = " + item.Value);
}
}
}
위 예제에서는 string형 Key와 int형 Value를 저장하는 Dictionary를 생성하고, Add 메서드를 사용하여 요소를 추가합니다. Count 속성을 사용하여 요소 개수를 출력하고, foreach 루프를 사용하여 모든 요소를 출력합니다. 이후 TryGetValue 메서드를 사용하여 Key가 "One"인 요소의 Value 값을 얻어 출력합니다. Remove 메서드를 사용하여 Key가 "Two"인 요소를 제거합니다. 다시 Count 속성과 foreach 루프를 사용하여 요소 개수와 모든 요소를 출력합니다.
'C# 프로그래밍' 카테고리의 다른 글
[C#] 인덱서 (0) | 2023.02.24 |
---|---|
[C#] 컬렉션 초기화 (0) | 2023.02.24 |
[C#] 컬렉션 (1) | 2023.02.23 |
[C++][C#] 클래스 객체 인스턴스 생성 (0) | 2023.02.22 |
C++, C# 에서 "call by reference" , "pass by reference" (0) | 2023.02.22 |