우리는 인터넷, TV, 책 등 매일 엄청난 양의 자료 속에서 살아가고 있다. 사회가 정보화되고 다양화될수록 사용할 수 있는 자료는 더욱 풍부해지고 다양해진다. 정보의 홍수로 부를 만큼 자료가 방대해지면서 자료를 얼마나 많이 가지고 있느냐보다는 얼마나 효율적으로 잘 사용하느냐가 중요해졌다.
예를 들어, 문구점에서 필기구를 진열하는 방법을 떠올려 보자. 여러 종류의 필기구를 아무렇게나 섞어서 진열할 수도 있지만, 종류나 색상에 따라 분류하여 진열할 수도 있다. 원하는 필기구를 찾을 때 어떤 방법이 더 효율적일까? 단순히 생각해 봐도 종류나 색상에 맞춰 분류해 둔 것을 더 쉽게 찾을 수 있다. 자료도 마찬가지이다. 자료를 효율적으로 표현하고 저장하고 처리할 수 있도록 정리하는 것이 자료구조이다.
[그림 1-1] 생활 속에서 자료구조를 적용한 예
그렇다면 컴퓨터에서는 자료구조가 어떻게 사용되고 있을까? 컴퓨터는 자료를 효과적으로 표현하고 효율적으로 저장 및 처리할 수 있도록 논리적인 구조로 설계하고 분석하여 프로그램에 사용한다. 컴퓨터는 자료를 처리하는 장치이므로, 자료구조는 컴퓨터 관련 분야에서 기본적이고도 필수적인 개념이다.
'모든 일을 컴퓨터가 하는데 우리가 왜 자료구조를 공부해야 하는가?'라는 의문을 가질 수 있다. 이런 의문을 풀기 위해 컴퓨터를 이용해 문제를 해결하는 과정을 살펴보자.
컴퓨터가 자료를 효율적으로 처리할하려면 [그림 1-2]와 같이 문제 도출과 문제 변환 단계에서 문제를 자료구조 측면에서 분석하고 구성해야 한다. 사용자 (프로그래머)는 문제를 더 효율적이고 효과적으로 해결하기 위해 문제를 정의하고, 처리 방식을 결정하여 알고리즘을 작성하고 자료를 정의해야 한다. 이러한 과정에서 자료구조에 대한 개념을 이해하고 이를 활용하는 능력이 필요하다.
[그림 1-2] 문제 해결 과정
자료구조에서 다루는 내용은 [그림 1-3]과 같다. 자료구조는 이론적인 측면, 효율적인 측면, 실제적인 측면에서 응용을 모두 다루어야 한다. 이론적인 측면에서는 그래프 이론, 집합 이론, 조합적 분석의 이산 수학과 확률 이론을 기본으로 알고리즘을 분석하여 검색, 정렬 방법 등을 결정하고, 공간 복잡도와 시간 복잡도를 기준으로 효율 분석을 통해 최적의 상태를 결정한다. 이렇게 결정한 내용에 따라 자료를 문자열, 리스트, 트리, 그래프, 파일 등의 구조로 실제적으로 표현하고 알고리즘을 구현하여, 프로그래밍과 파일 작성 및 메모리 관리와 운영체제 등에 사용한다.
[그림 1-3] 자료구조의 내용
성공적인 시스템을 개발하는 고급 개발자가 되려면 자료의 특성을 이해하고 분석하여 최적의 알고리즘을 개발하는 능력이 필요하다. 이러한 능력을 키우려면 자료구조를 학습해야 한다.