C#에 대한 공부를 하면서 L-ATS v2.0 개발을 진행하다보니 생각했던대로 되지 않거나 내 설계 방향으로는 구현이 불가능한 부분들이 종종 발생한다.
앞서 포스팅한 '주식종목'에 대한 클래스(객체) 사용을 객체 배열(Array)을 사용하였는데...(단순히 C/C++ 개발자로써 구조체 배열을 생각했기에...) 사실, 데이터의 빠른 접근 때문에 배열(Array)자체를 매우 선호하는 편이다.
객체 배열을 DatagridView에 Binding하는 과정에서 C#에서는 Collection(콜렉션)이란 강력한 도구를 제공한다는 것을 알았다. C# 기본서와 구글링을 통해 알게 된것은 C언어에서처럼 구조체 배열과 같은 형태의 데이터 구조는 DataGridView에 Binding하기에 적합하지 않은것 같다.
C#에서 제공하는 ArrayList와 Collection, 그리고 Generic Collection에 대해 짚고 넘어가야겠다.
이미 '주식종목' 부분의 설계와 개발이 거의 끝나가고 있는데...뒤집어 엎어야 할거 같다....
컬렉션(Collection)
- 같은 Type의 데이터를 모아서 처리하는 데이터 구조.
- 배열(Array)은 컬렉션 중의 하나라고 할 수 있음.
- 컬렉션은 Generic Collection 과 Non-Generic Collection이 있음.
ArrayList
- 배열과 유사한 자료구조.
- 배열과 달리 그 크기를 미리 지정하지 않고 동적으로 할당 가능.
- 모든 타입의 데이터가 저장될 수 있음. (Parameter의 Type이 Object임)
- 관리하는 데이터가 많아질 수록 속도가 느려짐.
수행할 작업 | Generic Collection | Non-Generic Collection |
키별로 빠르게 접근할 수 있도록 키/값의 쌍으로 저장 | Dictionary(Tkey, TValue) | Hash Table |
인덱스 별로 항목 액세스 | List<T> | Array ArrayList |
FIFO 방식으로 항목 사용 | Queue<T> | Queue |
LIFO 방식으로 항목 사용 | Stack<T> | Stack |
순서대로 항목 액세스 | LinkedList<T> | - |
컬렉션에 항목을 추가하거나 삭제할 떄 알림 표시 | ObserverbleCollection<T> | - |
정렬된 컬렉션 | SortedList<t> | SortedList |
수학 함수용 집합 | HashSet<T> SortedSet<T> |
- |
위의 내용을 보면...Generic Collection의 경우 C#에서만 제공하는 Optimized 도구들인것 같은 느낌이다.
Non-Generic Collection의 경우는 구식 도구들인것 같은 느낌...C#에서는 두 가지 형태 모두 제공한다는 것이고.
사실 Generic Collection은 컴파일 타입에 Type-Safe(형식이 안전한)하기에 Non-Generic Collection보다 성능이 좋다고 한다.
Dictionary는 Python에서도 자주 사용하는 Data 구조로 그 활용성이 매우 좋음을 알고 있기에, 내가 만들려는 '주식종목' 목록에 대해 Dictionary의 TValue가 Object 형식으로 저장이 가능하다면 Dictionary를 사용해야겠다.
Dictionary(딕셔너리)
'사전'. 사전을 펼쳐보면 가장 마지막 부분에 Index가 있다. 몇몇의 [키워드]들이 나열되어 있고, 그 키워드에 대한 [내용]이 몇 페이지에 존재하는지 표시되어 있는...
때문에 찾기 원하는 내용의 [키워드]를 알고 있으면 빠르게 [내용]을 찾을 수 있다.
Dictionary의 원리는 이것과 같다.
Array(배열)도 마찬가지다. 원하는 데이터가 저장되어 있는 Index(배열의 Index)를 알면 바로 데이터를 가져올 수 있다.
Dictionary는 Index 대신, 특정 Key 값(사용자가 원하는)을 사용할 수 있기에 보다 인지하기 쉽고 가독성(Readability)이 좋다.
< 주의 사항 >
1. 중복된 키(Tkey)를 사용할 수 없음. 'ArgumentException' 발생.
2. 존재하지 않는 키(Tkey)로 검색 시 'KeyNotFoundException' 발생.
3. Array와 같이 순차적인 숫자 Index 사용 불가.
다음은 C# 기본서에 있는 Dictionary 예제이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dictionary
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> colorTable = new Dictionary<string, string>();
colorTable.Add("Red", "빨간색");
colorTable.Add("Green", "초록색");
colorTable.Add("Blue", "파란색)");
foreach (var v in colorTable)
Console.WriteLine("colorTable[{0}] = {1}", v.Key, v.Value);
// 동일 Key 값을 추가하는 경우
try
{
colorTable.Add("Red", "빨강");
}
catch(ArgumentException e)
{
Console.WriteLine(e.Message);
}
// 없는 Key 값을 찾는 경우
try
{
Console.WriteLine("Yellow => {0}", colorTable["Yellow"]);
}
catch(KeyNotFoundException e)
{
Console.WriteLine(e.Message);
}
}
}
}
Add() 함수가 쉽게 Dictionary Item을 추가할 수 있도록 해주며, Tkey의 위치의 영문값이 Key가 되어 빠르게 TValue에 해당하는 값을 읽어올 수 있는 구조이다.
Dictionary<string, string>은 TKey와 TValue를 모두 'string' Type으로 지정하여 Dictionary를 생성하였으므로, 객체를 사용할 결루 Dictionary<string, object명>을 사용하면 될 것 같다.
그럼...TValue 쪽에 해당하는 객체(object)는...DataGridView에 어떻게 또 Binding을 시킬 수 있을지...걱정이 앞서긴 하지만...다음 C# 포스팅은 Dictionary를 DataGridView에 Binding하는 걸 해야겠다.
'C#' 카테고리의 다른 글
[C#] Form Close에 따른 Disposed Exception (0) | 2023.03.29 |
---|---|
[C#] Class 속성, Property, 프로퍼티 (1) | 2020.08.21 |
[C#] 클래스 배열, 객체 배열, Null Reference Exception (0) | 2020.08.13 |
[C#] 다른 파일, 다른 클래스 값/함수 사용 (1) | 2020.06.28 |
[C#] delegate, 폼 간의 DATA 공유 (2) | 2020.06.20 |