컬렉션과 제네릭

Coding Cat·2024년 7월 15일

C#

목록 보기
6/11

컬렉션은 데이터를 호율적으로 저장, 검색, 조작할 수 있는 다양한 기능을 제공한다. 주요한 컬렉션 클래스들은 닷넷 프레임워크의 일부로 제공되며, System.CollectionsSystem.Collections.Generic 네임스페이스에 정의되어 있다.

  • C#에서 지원하는 자료구조 클래스
  • 자료구조 : 데이터를 구조적으로 표현하고, 구현하는 중요한 알고리즘
  • 종류 : Queue, Stack, ArrayList(Array), Hashtable 등
  • object형식을 사용하여서 박싱과 언박싱이 발생. 성능이 떨어지는 이슈가 있다
  • 대용량의 데이터를 처리하기 위해서는 적절한 자료구조를 사용해야 하며 그렇지 않은 경우, 엄청난 비용(속도, 메모리 낭비) 등의 손실을 발생하므로 중요도가 높다.

ArrayList : 필요에 따라 크기가 동적으로 증가하는 개체 배열
Hashtable : 키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션(dictionary와 hashtable의 차이)
Queue : FIFO(선입선출) 방식의 개체 컬렉션
Stack : LIFO(후입선출) 방식의 개체 컬렉션

참고
C# 컬렉션

Array, List, ArrayList

Array

  • 고정된 크기의 요소들을 저장할 수 있는 컬렉션
  • 배열의 크기는 생성 시점에 결정, 변경 불가능
  • 인덱스를 사용하여 요소에 직접 액세스 가능
  • 다차원 배열도 지원

List

  • 동적으로 크기가 조정될 수 있는 컬렉션
  • 요소의 추가, 삭제, 수정 등이 자유로움
  • 인덱스를 사용하여 요소에 직접 액세스 가능
  • Generic으로 구현되어 타입 안정성 보장

ArrayList

  • 동적으로 크기가 조정될 수 있는 컬렉션
  • 요소의 추가, 삭제, 수정 등이 자유로움
  • 인덱스를 사용하여 요소에 직접 엑세스 가능
  • 박싱, 언박싱으로 인한 성능 저하가 있을 수 있음

제네릭

일반화 프로그램(제네릭 프로그램)은 데이터 형식을 일반화하는 기법이다. 제네릭을 사용하면 다양한 형식의 데이터를 처리하는 메소드와 클래스를 작성할 수 있으며 컴파일 시점에서 안정성을 보장한다.

제네릭 타입(Generic Type)을 사용하면 int, float, double 등 특정 데이터 타입을 확정하지 않고 데이터 타입 자체를 타입 파라미터(Type Parameter)로 받아 정의할 수 있다.

① Generic : 박싱과 언박싱이 발생하지 않음. 성능면에서 훨씬 좋음.
② 데이터를 저장하는 시점에 데이터 타입을 지정(박싱 발생하지 않음)
③ 데이터를 사용하는 시점에 데이터 타입을 지정했으므로 형변환(언박싱) 하지 않아도 됨.
④ 자신이 지정한 타입만 저장할 수 있다. (데이터 타입을 미리 지정해둠)
⑤ List, Dictionary<TKey, TValue>, Queue, Stack이 제네릭에 해당된다.

일반화 컬렉션

  1. List : 가변배열 제네릭 클래스.

  2. LinkedList : 이중 연결 리스트 제네릭 클래스

  3. Queue : 자료구조 큐.(FIFO) 제네릭 클래스

  4. Stack : 자료구조 스택.(LIFO) 제네릭 클래스.

  5. Dictionary<TKey,TValue> : 자료구조 해시 테이블. 제네릭 클래스

제네릭 메소드, 제네릭 클래스 생성자

제네릭 클래스의 생성자에서 맴버변수의 값을 초기화 할 수 있다.

public class GenericClass<T>
{
  public GenericClass() { }

  public GenericClass(T t)
  {
    objMember = t;
  }

  public T objMember { get; set; }
}

static void Main(string[] args)
{
  GenericClass<int> genericObj = new GenericClass<int>(10);

  Console.WriteLine(genericObj.objMember); // 10

멤버 변수에 타입에 따라 기본값을 할당해야 하는 경우 default 연산자 를 사용할 수 있다.
숫자형은 0, 문자형은 ""이 할당된다.

public class GenericClass<T>
{
  public GenericClass() 
  {
    objMember = default(T);
  }

  public T objMember { get; set; }
}

static void Main(string[] args)
{
  GenericClass<int> genericObj = new GenericClass<int>();

  Console.WriteLine(genericObj.objMember); // 0

Generic 제약 Where

제약 조건내용
where T : structT는 null을 허용하지 않는 값 형식
where T : classT는 참조 형식
where T : new()T는 매개 변수가 없는 public 생성자가 있어야 한다. 다른 제약 조건과 함께 사용되는 경우 new() 제약 조건을 마지막에 지정해야 한다.
where T : notnullT는 null이 아닌 형식이어야 한다.
where T : unmanagedT는 null이 아닌 비관리형 형식이어야 한다.
where T : <base class name>T는 지정된 기본 클래스이거나 이 클래스에서 파생된 클래스여야 한다.
where T : <interface name>T는 지정된 기본 인터페이스이거나 이 인터페이스에서 파생된 유형이여야 한다.
where T : UU는 인터페이스, 추상 클래스 또는 일반 클래스가 될 수 있으며, T는 U에서 상속되어야 한다.

추가로
where T : Delegate(C# 7.3 추가), where T : Enum(C# 7.3 추가), where T : default(C# 9.0 추가)

profile
나의 archive

0개의 댓글