자료구조 개념 정의
이번 포스팅은 가장 흔히 접할 수 있는 자료구조에 대해 한줄 정리를 하는 간단한 포스팅이 될 예정입니다.
먼저 자료구조의 정의에 대해 간단히 집고 넘어가자면,
자료구조(資料構造, 영어: data structure)는 전산학에서 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다.
출처 : [위키피디아 - 자료구조]: https://ko.wikipedia.org/wiki/자료_구조
대량의 데이터를 효율적으로 관리하는 메커니즘이며, 현실 세계에서의 우편번호나 학교에서 학생번호가 대표적인 예가 될 수 있습니다.
예를 들면 학생이 1000명 있는 학교에서 특정 학생을 이름으로 찾으려면 최소 1회 최대 1000회의 노력이 들어갑니다. 하지만 우리는 이런 방식으로 학생을 찾지 않습니다. 1학년 2반 3번 이새로찬 이런식으로 찾게 됩니다. 어떤 학생이든 3회만에 찾을 수 있는 조건이 만들어 지게됩니다. 이렇듯 대량의 데이터를 효율적으로 관리하는 방식을 자료구조라 합니다.
컴퓨터에는 다양한 방식의 자료구조들이 존재하며, 프로그래밍 언어마다 내장된 기본 자료구조도 다릅니다. 그럼 이제 기본적인 자료구조를 살펴보러 가시죠. Here we go~!!
자료구조 종류 및 기본 개념
배열
컴퓨터 프로그래밍을 시작하면서 가장 먼저 접하게 되는 자료구조입니다. 배열은 데이터가 일직선상에 빈틈없이 나열한 자료구조 입니다. 여기서 키포인트는 빈틈없이 나열되 었다는 점입니다. 배열과 리스트를 헷갈려하시는 분들이 있는데 이 부분은 리스트에서 추가 설명드리겠습니다.
리스트
데이터가 순차적으로 나열된 자료구조 입니다. 배열과 같이 나열된 데이터를 관리 한다는 부분에서 혼란을 줍니다. 하지만 배열과 리스트의 그림을 보면서 이해하면 차이점이 좀 더 명확히 이해되실겁니다. 배열은 나열된 데이터를 인덱스(쉽게 설명하자면 박스의 이름)으로 데이터를 색인(검색) 가능하다면 리스트는 포인터(쉽게 생각하자면 연결 빨대)로 서로 연결되 있으며, 포인터(연결 빨대)를 통해 검색이 이루어 질 수 있습니다. 그럼 한 가지 질문을 드리자면 특정 Index(위치)를 검색할때 배열과 리스트 중 어느 자료구조의 평균 검색속도가 빠를까요?
스택
스택 == 쌓다. 단어 뜻 그대로 쌓이는 자료구조입니다. 스택의 경우는 크게 두가지 액션을 갖는데 푸쉬와 팝입니다. 말그대로 데이터를 푸쉬 집어넣고, 팝 꺼냅니다. 이게 다입니다!! 먼저 들어간 데이터가 가장 나중에 나오게 되는 스택(FILO: FIRST IN, LAST OUT.). 자료구조는 어느 곳에 사용하면 효율적일까요?
큐
큐는 스택과 반대되는 개념으로 1차선 터널을 생각하시면 됩니다. 1차선 터널에서 먼저 들어간 차가 먼저 나오게 될 것입니다.(FIFO: FIRST IN, FIRST OUT) 이러헌 큐(대기행렬)는 어떤 데이터 관리에 효율적일까요?
이진 트리
이진트리는 다음 요소(노드)를 가리키는 포인트를 2개 갖는 단방향 리스트의 일종이라고 할 수 있습니다. 상위노드를 부모노드 라 하며 하위노드를 자식노드라 합니다. 가장 최상위 노드를 뿌리라 하며 최하위 노드를 잎(리프)라고 부릅니다.
- 힙(HEAP) - 부모노드의 값이 자식노드의 값보다 항상 작은(또는 항상 큰) 규칙을 갖는 이진 트리를 힙이라 합니다.
그래프
마지막 그래프입니다. 기본적으로 그래프는 아래그림에서 보시다 시피 각항 목을 의미하는 정점(노드)와 정점의 관계를 표현하는 간선으로 구성된 자료구조입니다. 한 마디로 데이터의 관계를 노드와 엣지로 표현한 자료구조입니다. 검색 시스템에서 많이 사용되는 자료구조입니다. 간단히 설명하자면 검색단어를 검색하고, 검색단어에 해당하는 노드에 연결된 노드들을 이어주는 간선의 가중치나 관계를 파악함으로서 검색결과를 다양하게 뽑아낼수 있게됩니다.
결론
사실 자료구조만 띡!! 놓고 학습하면 생각보다 각각의 자료구조들이 어디에 사용되고 사용해야할지 의문이 많이듭니다. 그래서 저는 이를 학습하는 방법으로 자료구조를 직접 구현해볼 예정입니다. 사실 저에게 자료구조와 알고리즘 학습은 많은 인내를 요구합니다. 대부분의 다른분들도 그러리라 생각됩니다. 하지만 앞선 포스팅 자료구조 알고리즘은 꼭 필요한 것인가? 의 정신을 다시한번 되세기며 자료구조와 알고리즘을 내 코딩에 자연스럽게 녹여내는 날까지. 화이팅입니다!!
Reference
잘못된 부분에 대한 지적은 언제든지 감사히 받겠습니다.
rochan87@gmail.com