C#, 자료구조

[자료구조] - 자료구조란 무엇일까?

MuscleDeveloper5683 2024. 3. 26. 21:42
728x90
SMALL

 

자료구조(Daga Structure) : 데이터를 구성하고 저장하는 데 사용되는 방법이나 구조를 의미하며 데이터를 효율적으로 접근하고 조작할 수 있게 데이터 구조를 만들어 관리하는 것이다. 

한줄요약 -  데이터 보관 방법 = 자료구조

 

 

1. 자료구조 왜 사용할까?

  • 효율적인 데이터 관리를 위해 복잡한 데이터들을 체계적으로 관리해 빠르게 찾고 쉽게 사용할 수 있다.
  • 최적화 - 자료구조는 알고리즘과 함께 사용되어 데이터를 효과적으로 조작하고 관리하는 데 도움을 주며 적절한 자료구조를 선택하고 활용하면 프로그램의 성능과 유지보수성을 향상시킬 수 있다.

 

 

2. 자료구조 종류

  • 단순 구조(Primitive Data Structure) : 정수, 실수, 문자, 부울린 등의 기초 타입들이 있다.
  • 선형 구조(Linear Data Structure) : 자료 요소가 선형적으로 연결되어 있는 구조로서 앞 자료와 뒤 자료가 1대 1인 구조를 갖는다. 배열, 연결 리스트, 스택, Queue 같은 자료구조가 있다.
  • 비선형 구조(Non-linear Data Structure) : 자료 간 관계가 1대 다 혹은 다 대 다 구조로서 계층구조 혹은 네트워크 망 구조를 갖는다. 트리와 그래프가 있다.

 

 

3. 선형과 비선형에 대해

 

선형 요약 - 선형 구조는 데이터 요소가 일렬로 나열되어 있고 각 요소가 바로 이전과 바로 다음 요소와 관련이 있는 구조이다.

장점 단점
간단하고 직관적: 선형 구조는 각 요소가 일렬로 나열되어 있어 구현이 간단하고 직관적
제한된 구조: 선형 구조는 각 요소가 바로 이전과 바로 다음 요소와만 관련이 있어 복잡한 관계를 표현하기 어려움
빠른 검색 및 접근:  요소들이 순차적으로 저장되어 있어 검색 및 접근 속도가 상대적으로 빠름 삽입 및 삭제의 어려움: 중간에 요소를 삽입하거나 삭제할 경우, 이전 및 이후의 모든 요소를 이동시켜야 하는 경우가 발생할 수 있음

 

 

 

비선형 요약 - 비선형 구조는 데이터 요소가 계층적이거나 서로 연결되지 않은 구조로, 계층이나 연결 관계가 없거나 여러 관계를 가질 수 있다.

장점 단점
다양한 관계 표현: 비선형 구조는 요소 간에 다양한 관계를 표현할 수 있어 복잡한 데이터를 구조화하기에 적합 복잡한 구현: 비선형 구조는 구현이상대적으로 복잡하고 이해하기
어려움
유연성과 확장성: 계층적인 구조나 여러 관계를 가진 그래프는 데이터의 유연한 표현과 확장이 가 검색 및 접근의 어려움: 선형 구조에 비해 검색 및 접근 속도가 느림, 특히 그래프의 경우 최적의 경로를 찾는 것이 어려움

 

 

 

4. 선형,비선형 종류

 

선형

  1. 배열 (Array): 동일한 데이터 형식의 요소를 순차적으로 저장하는 고정 크기의 자료구조입니다. 인덱스를 사용하여 각 요소에 접근할 수 있다.
  2. 연결 리스트 (Linked List): 각 요소가 데이터와 다음 요소를 가리키는 포인터로 이루어진 자료구조입니다. 메모리의 불연속적인 위치에 데이터를 저장
  3. 스택 (Stack): 후입선출(LIFO) 구조를 가지며, 데이터를 넣는 작업을 푸시(push), 꺼내는 작업을 팝(pop)이라고 한다.
  4. 큐 (Queue): 선입선출(FIFO) 구조를 가지며, 데이터를 넣는 작업을 인큐(enqueue), 꺼내는 작업을 디큐(dequeue)라고 한다.

 

비선형

  1. 트리 (Tree): 계층적인 구조를 가지며, 각 노드는 하나 이상의 자식 노드를 가질 수 있다. 이진 트리, 이진 탐색 트리 등이 있다.
  2. 그래프 (Graph): 노드와 간선으로 이루어진 자료구조로, 노드 간의 관계를 표현 방향성과 순환 여부에 따라 다양한 종류의 그래프가 있다.
  3. 해시 테이블 (Hash Table): 키-값 쌍을 저장하며, 키를 해싱하여 해당 키에 대한 값을 빠르게 검색할 수 있는 자료구조이다. 일반적으로 특정한 순서를 가지지 않는다.
  4. 힙 (Heap): 이진 트리 기반의 자료구조로, 최댓값 또는 최솟값을 빠르게 찾기 위해 사용된다. 특히 우선순위 큐를 구현하는 데 사용된다.

 

 

 

Generic 과 none Generic 차이

 

Generic  - 일반화된 프로그래밍을 지원하기 위한 기능이다. 이를 통해 데이터나 메서드가 특정한 데이터 유형에 종속되지 않고 보다 유연하게 사용하며  컴파일 타입에 안전성을 보장하면서 재사용 가능한 코드를 작성할 수 있다.

 

None Generic Generic을 사용하지 않는 일반적인 데이터 유형이나 구조를 의미한다.  이는 C#의 이전 버전에서 사용되는 방식이며, Generic이 도입되기 전에는 개발자가 특정한 데이터 유형에 종속된 코드를 작성하는 형태였다. 

 

 

 

🔥None Generic은  박싱과 언박싱을 할 때 메모리 낭비와 속도가 저하될 수 있다.

그러므로 Generic을 사용하면 코드의 재사용성과 유연성을 크게 향상시킬 수 있으므로 Generic을 많이 활용하자🔥

 

 

박싱과 언박싱

Boxing  UnBoxing
값 형식(예: int, float, double 등)의 인스턴스를 참조 형식(예: object)으로 변환하는 프로세스를 말합니다. 박싱된 값을 다시 원래 값 형식으로 변환하는 프로세스입니다.
int -> object로 형변환 한다. object -> int 로 형변환 한다.

 

 

 

 

Generic Non - Generic 사용
Dictionary<TKey,TValue> Hashtable Key로 빠르게 조회 후 Value 반환
List<T> Array, ArrayList 데이터가 저장된 인덱스에 빠르게 접근 가능
Queue<T> Queue FIFO(선입 선출) 방식
Stack<T> Stack LIFO(후입 선출) 방식
SortedList<Tkey,Tvalue> SortedList 입력된 순서와 관계없이 Key값으로 정렬
LinkedList<T> X 데이터 등록, 삭제가 빈번하게 일어날 경우 사용
ObservableCollection<T> X 목록에 데이터를 넣거나 뺄 때 알림을 표시해준다.
HashSet<T>, SortedSet<T> X 중복된 데이터를 저장하지 않을 때

 

 

 

 

 

None Generic의 코드 예시

 

아래 코드에서 MyList 클래스는 internalList라는 ArrayList를 가지고 있다. ArrayList는 모든 종류의 객체를 저장할 수 있는 비제네릭 컬렉션이며, Add 메서드와 PrintAll 메서드는 object 타입을 매개변수로 받는다. 따라서 이 클래스를 사용할 때마다 적절한 형변환을 해야 한다.

이 코드는 Generic을 사용한 코드보다 타입 안정성이 떨어지며, 형변환의 오버헤드가 발생할 수 있다. 또한 컴파일 타임에 타입 체크가 이루어지지 않으므로 런타임 오류가 발생할 가능성이 높다. 이러한 이유로 Generic을 사용하여 타입 안정성을 보장하는 것이 바람직하다.

 

 

 

 

Generic의 코드 예시

 

 

 

 

실행 결과

 

두 스크립트다 같은 결과가 나오지만 Generic을 사용함이 성능에 더 좋다.

 

 

 

728x90