자료구조(Daga Structure) : 데이터를 구성하고 저장하는 데 사용되는 방법이나 구조를 의미하며 데이터를 효율적으로 접근하고 조작할 수 있게 데이터 구조를 만들어 관리하는 것이다.
한줄요약 - 데이터 보관 방법 = 자료구조
1. 자료구조 왜 사용할까?
- 효율적인 데이터 관리를 위해 복잡한 데이터들을 체계적으로 관리해 빠르게 찾고 쉽게 사용할 수 있다.
- 최적화 - 자료구조는 알고리즘과 함께 사용되어 데이터를 효과적으로 조작하고 관리하는 데 도움을 주며 적절한 자료구조를 선택하고 활용하면 프로그램의 성능과 유지보수성을 향상시킬 수 있다.
2. 자료구조 종류
- 단순 구조(Primitive Data Structure) : 정수, 실수, 문자, 부울린 등의 기초 타입들이 있다.
- 선형 구조(Linear Data Structure) : 자료 요소가 선형적으로 연결되어 있는 구조로서 앞 자료와 뒤 자료가 1대 1인 구조를 갖는다. 배열, 연결 리스트, 스택, Queue 같은 자료구조가 있다.
- 비선형 구조(Non-linear Data Structure) : 자료 간 관계가 1대 다 혹은 다 대 다 구조로서 계층구조 혹은 네트워크 망 구조를 갖는다. 트리와 그래프가 있다.
3. 선형과 비선형에 대해
선형 요약 - 선형 구조는 데이터 요소가 일렬로 나열되어 있고 각 요소가 바로 이전과 바로 다음 요소와 관련이 있는 구조이다.
장점 | 단점 |
간단하고 직관적: 선형 구조는 각 요소가 일렬로 나열되어 있어 구현이 간단하고 직관적 |
제한된 구조: 선형 구조는 각 요소가 바로 이전과 바로 다음 요소와만 관련이 있어 복잡한 관계를 표현하기 어려움 |
빠른 검색 및 접근: 요소들이 순차적으로 저장되어 있어 검색 및 접근 속도가 상대적으로 빠름 | 삽입 및 삭제의 어려움: 중간에 요소를 삽입하거나 삭제할 경우, 이전 및 이후의 모든 요소를 이동시켜야 하는 경우가 발생할 수 있음 |
비선형 요약 - 비선형 구조는 데이터 요소가 계층적이거나 서로 연결되지 않은 구조로, 계층이나 연결 관계가 없거나 여러 관계를 가질 수 있다.
장점 | 단점 |
다양한 관계 표현: 비선형 구조는 요소 간에 다양한 관계를 표현할 수 있어 복잡한 데이터를 구조화하기에 적합 | 복잡한 구현: 비선형 구조는 구현이상대적으로 복잡하고 이해하기 어려움 |
유연성과 확장성: 계층적인 구조나 여러 관계를 가진 그래프는 데이터의 유연한 표현과 확장이 가능 | 검색 및 접근의 어려움: 선형 구조에 비해 검색 및 접근 속도가 느림, 특히 그래프의 경우 최적의 경로를 찾는 것이 어려움 |
4. 선형,비선형 종류
선형
- 배열 (Array): 동일한 데이터 형식의 요소를 순차적으로 저장하는 고정 크기의 자료구조입니다. 인덱스를 사용하여 각 요소에 접근할 수 있다.
- 연결 리스트 (Linked List): 각 요소가 데이터와 다음 요소를 가리키는 포인터로 이루어진 자료구조입니다. 메모리의 불연속적인 위치에 데이터를 저장
- 스택 (Stack): 후입선출(LIFO) 구조를 가지며, 데이터를 넣는 작업을 푸시(push), 꺼내는 작업을 팝(pop)이라고 한다.
- 큐 (Queue): 선입선출(FIFO) 구조를 가지며, 데이터를 넣는 작업을 인큐(enqueue), 꺼내는 작업을 디큐(dequeue)라고 한다.
비선형
- 트리 (Tree): 계층적인 구조를 가지며, 각 노드는 하나 이상의 자식 노드를 가질 수 있다. 이진 트리, 이진 탐색 트리 등이 있다.
- 그래프 (Graph): 노드와 간선으로 이루어진 자료구조로, 노드 간의 관계를 표현 방향성과 순환 여부에 따라 다양한 종류의 그래프가 있다.
- 해시 테이블 (Hash Table): 키-값 쌍을 저장하며, 키를 해싱하여 해당 키에 대한 값을 빠르게 검색할 수 있는 자료구조이다. 일반적으로 특정한 순서를 가지지 않는다.
- 힙 (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을 사용함이 성능에 더 좋다.
'C#, 자료구조' 카테고리의 다른 글
[자료구조] - Tuple (0) | 2024.04.12 |
---|---|
Generic Collectin 메서드 (0) | 2024.04.05 |
[자료구조] - Collection이란? (0) | 2024.04.03 |
[자료구조] - Enum이란? (2) | 2024.03.05 |
[자료구조] - C# 다형성(polymorphism) - override와 virtual (2) | 2024.02.28 |