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하는 걸 해야겠다. 

 

 

 

 

Posted by [ 브랜든 ]
,