자료구조의 개념과 특징
자료구조(Data Structure)는 컴퓨터에서 처리할 자료를 효율적으로 관리하고 구조화시키기 위한 것이다. 즉, 자료를 효율적으로 관리하기 위해서 자료를 성질에 따라 분류하고 처리하여 저장하는 모든 작업을 의미한다. 자료를 처리하기 위해서는 무엇보다도 컴퓨터가 먼저 자료를 능숙하게 다룰 수 있도록 컴퓨터 내에 표현해주어야 하고, 그렇게 표현된 자료를 컴퓨터는 일정한 절차를 통해 다루게 되는 것이다. 자료구조에는 여러 종류가 있으며, 각각의 자료구조는 해당 구조의 연산 및 목적에 적합하게 짜여있다. 처리 중에 그 구조나 크기의 변화 여부에 따라 정적 자료구조와 동적 자료구조로 분류되는데, 정적 자료구조에서는 배열, 레코드 구조 등이, 동적 구조에서는 나무, 인덱스, 스택 등이 대표적이다. 이렇게 자료구조로 표현된 자료들을 이용하여 자료들을 처리하는 절차들의 모임을 알고리즘이라 한다. 다양한 프로그램을 설계할 때, 어떤 자료구조를 선택할지는 가장 우선하여 고려되어야 하는데 이는 큰 시스템을 제작할 때 프로그램 구현의 난이도나 최종 결과물이 자료구조에 의해 크게 좌우되기 때문이다. 일단 자료구조가 한 번 선택되면 이에 따라 자연스럽게 알고리즘도 명확해진다. 자료의 특성과 크기, 주요 사용법이나 연산, 구현에 필요로 하는 기억 공간의 크기에 따라 자료구조를 선택할 수 있는데 단순 구조와 자료 간의 관계가 1대 1인 선형구조, 1대 다 혹은 다 대 다 구조인 비선형 구조, 마지막으로 파일 구조가 있다. 선형 구조는 순차 리스트 또는 선형 리스트라고도 하는데, 데이터를 저장할 때 연속적인 기억공간에 배정하는 자료구조로서 배열, 큐, 스택, 데크, 연결 리스트 총 5가지가 있다. 비선형 구조는 그래프와 트리가 있다. 많은 고급 프로그램 작성 언어에서는 자료구조를 데이터형으로 명확하게 정의하는 경향이 있지만, 자료구조의 표현과 그에 대한 처리 절차를 취합하여 기술하는 추상 데이터형도 있다. 자료구조는 자료처리의 효율과 성능에 직접적인 영향을 미치므로 자료구조는 실제 자료의 관계를 잘 반영해야 하고 효율적으로 처리를 수행할 수 있도록 간단명료하지만 필요한 내용은 모두 포함되어야 한다. 대부분의 언어는 일정 수준의 모듈 개념을 가지고 있으며, 이는 자료 구조가 검증된 구현은 숨긴 채 인터페이스만을 이용하여 다양한 프로그램에서 사용되는 것을 가능하게 해 준다. 특히 C++나 자바와 같은 객체지향 프로그래밍 언어는 특별히 이러한 목적으로 객체를 사용한다. 앞서 봐온 자료구조의 중요성으로 인해 최근 프로그래밍 언어 및 개발 환경은 다양한 표준 라이브러리를 제공하고 있다. 그 예시로 C++의 표준 탬플릿 라이브러리, 자바의 자바 API, 마이크로소프트의 .NET와 같은 것들을 들 수 있다. 자료구조에서 가장 기초적인 단위는 행렬, 레코드, 참조와 같은 것이다.
자료구조의 이점
자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다. 자료구조를 사용하는 이유는 자료구조가 가진 다양한 이점들 때문인데, 효율성(Efficiency)과 추상화(Abstraction) 그리고 재사용성(Reusability)이라는 특징을 갖고 있기 때문이다. 자료를 구조화하여 사용하면 좀 더 효율적인 알고리즘을 구성할 수 있는데, 알고리즘을 사용하는 데 있어 자료를 구조화하여 사용함으로써 처리 시간, 처리 가능한 용량 등을 고려하여 적절한 알고리즘을 선택하여 사용할 수 있다. 또한 자료를 구조화하는 데 있어서 자료를 표현하고 다루는 방법을 추상화함으로써 프로그램이 가진 의존성에서 벗어날 수 있게 된다. 이렇게 의존적인 상황을 탈피하면 다양한 프로그램 언어의 사용이 가능하며 어떻게 구현할 것인가가 아닌 어디에 어떻게 사용할 것인가에 대한 보다 효율적인 목표에 초점을 두고 프로그램을 개발할 수 있다. 그리고 자료구조는 모듈화되어있고 특정한 상황에 얽매여 있지 않기 때문에 재사용에 용이하다. 문맥에 자유롭기 때문에 다양한 자료를 상황에 따라 여러 가지로 사용할 수 있으므로, 규정된 자료구조를 모듈화하여 사용하는 데 초점을 두어 다양한 프로그램에서 재사용하는 방향으로 접근해야 한다.
'소프트웨어 공학' 카테고리의 다른 글
릴리즈 노트 작성 시 고려사항과 작성 순서 (0) | 2021.11.18 |
---|---|
소프트웨어 패키징의 개요와 작업의 이해 (0) | 2021.11.18 |
소프트웨어 버전 관리의 개념과 버전 관리 도구의 종류 (0) | 2021.11.17 |
OSI 참조 모델(Open Systems Interconnection Reference Model)의 정의와 계층 기능 (0) | 2021.11.17 |
DRM(Digital Rights Management)의 정의와 종류 (0) | 2021.11.17 |
댓글