프로그래밍/C#

[C#] 컬렉션 (Collection)

갓똥 2020. 4. 23. 17:18
728x90
반응형

1. 핵심 정리

using System;

class Program {
    static void Main() {
        int[]    arr1 = {1, 2, 3, 4, 5};
        string[] arr2 = {"aa", "bb", "cc"};
    }
}

 ① 컬렉션 (Collection) 이란?

    => 동일 타입의 객체를 여러 개 보관 할 수 있는 클래스

    => 배열, Linked List, Tree, Hash Table 등의 자료구조를 구현한 클래스

    => 언어에 따라 Collection(C#, Java) 또는 Container(C++) 라는 용어를 사용

 

 ② int, double, string, 사용자 정의 타입등 다양한 타입에 대한 컬렉션이 필요

 

 ③ 어떤 타입을 보관할 것인가?

 


2. 데이터 저장 타입에 따른 분류

using System;
using System.Collections;

class Program {
    static void Main() {
        ArrayList c1 = new ArrayList();
        
        c1.Add(1);
        c1.Add(2);
        c1.Add("str");
        
        // int n = c1[0]; - error
        int n = (int)c1[0];
    }
}

먼저 ArrayList이다. Generic이 나오기전에 사용하던 것으로 요소추가는 Add메소드를 통해 한다.
Add메소드의 정의로 이동해보면 obejct를 인자로 받기 때문에 모든 타입을 인자로 받을 수 있다.
따라서 int형 타입만 받다가 string이 들어갈 수도 있는데 이러한 부분을
타입 안정성이 좋지 않다고 한다.
또한 값을 꺼낼 때도 object이므로 int로 캐스팅을 해서 꺼내야 한다.
namespace는 System.Collections을 열어놓으면 사용할 수 있다.

 

using System;
using System.Collections.Specialized;

class Program {
    static void Main() {
        StringCollection c2 = new StringCollection();
        
        c2.Add("aa");
        c2.Add("bb");
        // c2.Add(1); - error 타입 안정성이 좋다.
        
        string s = c2[0];
    }
}

다음은 StringCollection이다. 이것도 Generic이 나오기전에 만들어진 컬렉션이다.
위와 같이 Add메소드를 통해 요소를 추가한다.
Add메소드의 정의로 이동해보면 string만 넣을 수 있는 것을 볼 수 있다.
이런걸 타입 안정성이 좋다고 한다.
또한 string만 넣었으므로 꺼낼때도 캐스팅 필요 없이 꺼낼 수 있다.
하지만 문제는 이건 string전용 컬렉션이고 나중에 int, double형이 필요하다면
다 만들어야 하는 문제가 있다. C#에서는 자주 사용하는것만 만들어 주었는데 문자열이 그 경우이다.
namespace는 System.Collections.Specialized를 열어주면 사용할 수 있다.

 

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        List<int> c3 = new List<int>();
        
        c3.Add(1);
        c3.Add(2);
        // c3.Add("aa"); - error 타입 안정성이 뛰어나다.
        
        int n = c3[0];
    }
}

다음으로 볼게 Generic 컬렉션인 List이다.
Add메소드의 정의로 이동해보면 제너릭으로 되어 있는것을 볼 수 있다.
위의 경우 int로 놓았으므로 int만 보관가능하고 꺼낼 때도 int로 바로 받을 수 있다.
제너릭이므로 int, double, string 필요한 타입에 대해 만들어 사용하면 된다.
namespace는 System.Collections.Generic을 열어주면 된다.

 

using System;
using System.Collections.Concurrent;

class Program {
    static void Main() {
        ConcurrentStack<int> c4 = new ConcurrentStack<int>();
        
        c4.Push(10);
    }
}

 

다음은 위의 3개와는 좀 다른 관점인데 멀티 쓰레드에 안전한 컬렉션이다.
대표적으로 위의 ConcurrentStack이 있다.
제너릭으로 만들어져 있고, 무언가 요소를 추가할 때 멀티 쓰레드에 안전하다.
namespace는 System.Collections.Concurrent를 열어주면 된다.
그리고 쓰레드에 안전한 컬렉션을 더 알고싶다면
마이크로소프트 msdn으로 가서 찾아보면 확인할 수 있다.
728x90
반응형