SW 프로그램 구현시 우리는 많은 자료들을 사용합니다.
자료들은 크게 2가지 타입으로 나뉘는데 각 언어(language) 에 내장된(built-in) 타입과 사용자가 정의한 타입이 있습니다.
이런 자료들을 선언하면 컴퓨터는 각 자료의 크기에 맞게 메모리를 할당하고 사용자는 자료에 접근 할 때 메모리에 엑세스하여 읽
고/쓰게 (R/W) 하게 됩니다.
문제는 이런 자료들을 메모리에 저장 할 때 중구난방으로 막 저장하게 되면 자료를 효율적 다루기가 어려워 진다.
실생활을 예로 들어보자
외국어 공부에 사전은 필수이다. 만약 사전이 알파벳 (A-Z) 순서대로 1페이지부터 보이지 않고 일정한 규칙없이 마구 보여진다면 원하는 단어를 찾는데 매우 어려움을 호소할 것이다.
서점에서 책을 찾을 때도 카테고리별(경제, 역사, 외국어, 컴퓨터, 어린이등)로 구분되어서 책이 나열되어 있지 않다면 원하는 책을 찾기위해 서점을 처음부터 끝가지 찾아 돌아다녀야 할 것이다.
물론 위의 예는 요즘처럼 전산회 되어 있는 시대에서 검색으로 한방에 위치와 단어를 한방에 찾을 수 있지만 컴퓨터에서도 이런 자료를 어지럽지 않게 질서있게 상황에 맞게 저장되어 있기 때문에 빨리 검색해서 보여주는 것이다.
따라서 다양한 프로그램을 설계할 때, 어떠한 자료구조를 선택할지는 가장 우선적으로 고려되어야 한다.
이는 큰 시스템을 제작할 때 구현의 난이도나 최종 결과물의 성능이 자료구조에 크게 의존한다는 것을 많은 경험이 뒷받침하기 때문이다.
컴퓨터 전공자들은 보통 1학년 2학기 정도에 자료구조와 알고리즘 과목을 듣기 시작하기 때문에 대부분 졸지 않았으면 이론을 잘 알 고 있지만(????) 비전공자들이 SW 개발을 한다면 필수로 알아야만 한다.
사실 실무에서 코드리뷰를 하면서 몇번 놀란 적도 있긴 한데 컴퓨터 전공자 조차도 자료구조 선택을 제대로 못하거나 직접 구현할지 모르는 사람들도 있다. 그런 개발자들을 보면서 속으로 어떻게 이 회사 들어왔을까? 하고 생각한 적도 있었다.
요즘은 과거와 다르게(예전에 C언어는 모든 자료구조를 직접 구현해서 사용했던 시절이 있었다) 언어 마다 이미 내장된(구현된) 자료구조 클래스를 잘 지원하고 있으며 없는 것들은 third-party 라이브러리를 사용하고 있고 프레임워크 자체가 워낙 잘 되어 있는것들이 많다 보니 정형화된 틀에서 개발을 하다 보니 어찌 보면 그럴수도 있겠구나 생각이 들지만 중요한 건 SW 구현시 자료구조나 알고리즘을 잘못 선택하면 전체적으로 설계를 모두 바꿔야 하는 경우도 발생하고, 면접이나 코딩테스트에도 자주 등장한다.
개발자로 업을 계속 하고 싶은 분은 무조건 시간을 내서라도 공부해야만 하는 영역이다.
자료구조 POST를 읽는 권장 순서는 다음과 같다.
- 배열(Array)
- 비트셋(BitSet)
- 연결리스트(LinkedList)
- 튜플(Tuple)
- 스택(Stack)
- 큐(Queue)
- 덱(Deque)
- 해시테이블(Hash Table)
- 셋(Set)
- 트리(Tree)
- 이진트리(Binary Tree)
- 이진탐색트리(Binary Search Tree)
- 힙(Heap)
- 우선순위큐(Priority Queue)
- 균형이진탐색트리(Balanced Binary Search Tree)
- 스플레이 트리(Splay Tree)
- AVL 트리
- 레드-블랙 트리(Red-Black Tree)
- 다원탐색트리(Multiway Search Tree)
- B 트리
- B+ 트리
- B* 트리
- 그래프(Graph)
- 그래프(Graph) 구현
- 그래프(Graph)-너비우선탐색(BFS, Breadth First Search)
- 그래프(Graph)-깊이우선탐색(DFS, Depth First Search)
- 신장트리(Spanning Tree)
- 최소신장트리(MST, Minimum Spanning Tree)
- 최소신장트리(MST, Minimum Spanning Tree)-크러스컬(Kruskal) 알고리즘
- 최소신장트리(MST, Minimum Spanning Tree)-프림(Prim`s) 알고리즘
- 최단경로 길찾기
- 트라이(Trie)
- 세그먼트 트리(Segment Tree)
'자료구조(Data Structure)' 카테고리의 다른 글
무방향 그래프(Undirected Graph) 구현 (0) | 2019.07.03 |
---|---|
그래프(Graph)란? (0) | 2019.07.03 |
최소신장트리(Minimum Spanning Tree) (0) | 2019.07.02 |
균형 이진탐색트리(Balanced Binary Search Tree) (0) | 2019.06.18 |
비트셋(BitSet) (0) | 2019.06.18 |