
우리는 매일 수많은 데이터와 정보를 다루며 이를 효율적으로 저장, 관리, 검색하고 분석하기 위해 다양한 도구와 기술을 활용한다.
이러한 데이터를 효과적으로 다루기 위한 핵심 개념 중 하나가 바로 자료 구조다.
자료 구조는 데이터를 저장하고 조직화하는 방법을 정의하며 프로그래밍 및 알고리즘 설계에 필수적인 요소라고 할 수 있다.
자료 구조를 올바르게 선택하고 사용함으로써 프로그램의 성능을 향상시키고 데이터 조작 및 검색을 빠르고 효율적으로 수행할 수 있기 때문에 자료 구조에 대해 학습을 진행하며 이를 블로그로 기록하려 한다.
대량의 데이터를 효율적으로 관리할 수 있는 데이터의 구조
자료구조가 프로그래밍에서 중요한 점은 컴퓨터의 메모리 자원은 한정적인 반면 처리해야할 데이터는 무수히 많을 수 있기 때문에 이 메모리 공간을 효율적으로 사용해야 하는데 필요한 것이 바로 자료 구조이다.
모든 목적에 맞는 자료구조는 없기 때문에 각 자료구조가 갖는 장점과 한계를 잘 아는 것이 중요하다.
예를 들어 한정된 책장에 책을 꽂는다고 가정해보자.
책장에 가장 많은 책을 꽂을 수 있는 방법은 아무 규칙 없이 있는 책 모두를 꽂아 넣는 것이다.
그럼 당장은 공간을 가장 효율적으로 사용한 것 같지만, 아무 규칙 없이 책을 꽂아 넣었기 때문에 찾을 때도 규칙 없이 모든 범위를 찾아야 한다.
하지만 책의 제목을 오름차순 형태로 꽂아 넣거나 책의 분야별로 분류해 책을 정리해 놓으면 나중에 다시 찾을 때 훨씬 더 빠르고 효율적으로 책을 찾을 수 있다.
위의 간단한 예시에서조차 책장 안에 다양한 이유와 목적을 가지고 책들을 진열할 수 있다.
하지만, 자료 구조에서는 메모리 공간의 효율뿐만 아니라 실행 시간의 효율성도 따진다.
자료구조는 다양한 데이터 조작 연산(삽입, 삭제, 검색, 순회 등)을 지원한다는 점이 있다.
각 자료구조는 특정 연산에 빠르고 효율적으로 대응할 수 있도록 설계되기 때문에 자료구조에 맞는 효율적인 연산을 사용해야 한다.
그 외에도 다양한 특징이 있는데 아래와 같다.
효율성 : 자료구조 사용의 목적은 효율적인 데이터관리 및 사용이다. 따라서 문제에 알맞은 자료구조를 사용한다면 업무 효율성이 증가한다.
추상화 : 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념, 기능을 간추려 내는 것이다.
재사용성 : 자료구조를 설계할 때 특정 프로그램에서만 동작하게 설계하지 않는다. 다양한 프로그램에서 동작할 수 있도록 범용성 있게 설계해 다른 프로젝트에서 사용 또한 가능하다.
자료구조를 선택함에 있어 개인적으로 가장 중요한 기준은 바로 데이터의 크기라고 생각한다.
사실 적은 양의 데이터를 처리할 때에는 어떤 자료구조를 사용하든 큰 차이가 없다.
그러나 대량의 데이터를 한 번에 처리함에 있어서 어떤 자료구조를 사용하는 가에 따라서 효율성에 있어 굉장한 차이가 있다.
예를 들어 스택(Stack)과 연결 리스트(Linked List)가 있다고 했을 때 원소 삽입에 대한 시간복잡도는 각각 O(1)과 O(n)이다.
데이터가 100만 개가 존재한다고 했을 때 한 번의 연산을 거치는 것과 100만 번의 연산을 거치는 것은 효율성 면에서 큰 차이가 있다.
그 외에도 다양한 선택 기준이 있는데 아래와 같다.
연산의 종류와 빈도: 프로그램에서 어떤 종류의 연산(삽입, 삭제, 검색, 순회 등)이 자주 수행되는지 파악하고 각 연산에 대한 효율적인 자료 구조를 선택해야 한다.
저장할 데이터의 형태: 저장해야 하는 데이터의 형태와 구조를 고려하여 데이터가 단순한 값인지, 복합 데이터인지, 그래프 형태인지 등에 따라 적합한 자료 구조가 달라질 수 있다.
프로그래밍 언어: 사용하는 프로그래밍 언어에 따라 사용 가능한 자료 구조가 제한될 수 있다.
알고리즘과의 조화: 자료 구조와 알고리즘은 밀접하게 연관되어 있다. 특정 자료 구조를 사용하는 것이 특정 알고리즘을 구현하기에 적합한 경우가 있으므로, 이 두 가지를 조화롭게 고려해야 한다.
알고리즘이란 어떤 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것
쉽게 말해 문제 풀이에 필요한 계산 절차 또는 처리 과정의 순서라고 생각하면 된다.
보통 자료 구조가 선택되면 그에 적용할 알고리즘은 거의 명확해진다.
즉, 자료 구조가 효율적인 알고리즘을 사용할 수 있게 함으로 자료 구조와 알고리즘은 매우 밀접한 관계를 가질 수 밖에 없다.
위의 예시를 다시 생각해보면, 책장에 진열된 책들을 어떤 순서나 규칙을 가지고 찾을 지에 대한 방법이라고 생각하면 된다.
왼쪽 부터 순서대로 찾을 수도 있고, 역순으로 찾을 수도 있고, 중간부터 찾을 수도 있다.
만약 클린 코드라는 책을 찾아야 할 때 책장에 진열되어 있는 구조에 따라 효율적으로 책을 찾는 방법이 달라지게 된다.
제목 순으로 진열되어 있다면 역순으로 찾는 방법을 선택하게 되고, 분야 별로 진열되어 있다면 IT 서적 쪽을 먼저 찾게 될 것이다.
즉, 위와 같이 보통은 자료 구조의 선택 => 효율적인 알고리즘의 선택이 된다.