[자료구조 A to Z] 들어가기 (Intro)

Lee Jae-Baek·2023년 6월 18일
1

자료구조 A to Z

목록 보기
1/16
post-thumbnail

왜 자료구조(Data Structure)를 해야하는가?

유튜브는 그 많은 영상들을 어떻게 저장하고 관리할까?
구글은 그 많은 사용자 정보들을 어떻게 저장하고 관리할까?
그 많은 자료들을 어떻게 그렇게 빨리 찾아서 우리한테 보여줄까?

정확한 해답은 유튜브와 구글만 알겠지만, 우리는 자료구조를 통해 1차원 세상을 사는 컴퓨터가 어떤 방식으로 2차원 세상의 자료를 관리하는지 추론해볼 수 있게 된다. 이것을 잘 이해하면 앞으로의 알고리즘을 포함한 전공 과목의 이해에 큰 도움이 될 것이다. 그런 이유에서 자료구조는 컴퓨터 공학을 전공한다면, 또한 개발자를 지망한다면 반드시 알아야 할 기초 과목으로 꼽히는 것이다.

자료구조를 처음 공부하는 사람이라면 하나하나 새로운 이론을 배울 때 마다 어려움을 느낄 수 있고, 또 포기하고 싶다는 생각이 들 수도 있다. 나 또한 그랬다. 그러나 그 난관들을 넘을 때 마다 분명히 성장했고, 매우 큰 성취감을 느꼈던 것 같다. 그런 성취감이 나를 포기하지 않게 만들었으며, 나중에 가서는 매주 2회 아침 9시마다 있는 자료구조 이론 수업과 금요일마다 있는 실습 시간을 손꼽아 기다리게 만들었다. (시험은 싫었다)

자료구조를 처음 접할 여러분도 나와 같이 포기하지 않고 끝까지 함께하며 성취감을 느꼈으면 한다. 나 또한 여러분을 위해, 포기하지 않고 남은 14개 챕터를 모두 완성시켜 보겠다.

정의해보기

자료구조에서는 배열, 리스트, 큐와 스택, 사전, 트리, 그래프 등을 배우게 되는데, 이들 모두 하나의 공통점을 가지고 있다.
모두가 "데이터" 즉 "자료"를 가지고 있다는 것이다.

* C++에서 배열은 인덱스마다 선언된 타입과 일치하는 자료가 저장되어 있다.

int main() {
	int a[5] = {1, 2, 3, 4, 5}; //int 타입의 Data 5개를 저장할 수 있는 배열 a
    char b[5] = {'a', 'b', 'c', 'd', '\0'}; 
    /* char 타입의 Data 5개를 저장할 수 있는 배열 b.
    	마지막 요소는 반드시 NULL문자인 '\0' */
{

자료구조라는 과목에서는 위에서 열거한 다양한 방법들을 통해 자료를 조직하고, 저장하고, 관리하는 방법을 배우게 된다. 따라서 자료의 추가와 수정, 삭제 등은 모든 자료구조에서 공통적으로 존재하는 기능이 될 것이라 예상해볼 수 있다.

"자료구조는 자료(Data)를 조직하고, 저장하고, 관리하는 컴퓨터 과학적 방법론"

가장 효율적인 방법?

컴퓨터 공학에서는 항상 "효율"을 추구한다. 그럼 자료구조에서도 가장 효율적인 방법만을 다루는가?

꼭 그렇지만은 않다. 효율을 추구해야 하는 것은 맞지만, 각 방법들마다 상황에 따른 장점과 단점이 존재하고, 단점을 알아야 다른 방법을 사용할때 얻는 이점을 알 수도 있다. 따라서, 가장 효율적인 방법이라는 것은 정의하기 어렵기 때문에, 본 시리즈에서는 자료구조라는 과목을 전반적으로 이해할 수 있도록 기본적인 방법은 모두 설명할 것이다.

자료구조와 알고리즘의 차이

자료구조가 자료를 어떻게 구성할 것인가? 라면, 알고리즘은 그렇게 구성된 자료구조를 활용해서 어떻게 문제상황을 해결할 것인가를 고민하고 그 순서를 정리한 것이다.

위는 1~6까지의 데이터를 서로 이동이 가능하게끔 설계한 그래프이다.

이 자체는 자료를 그래프 형식으로 '구조화' 한 것이다. 따라서 그래프 자체는 자료구조의 하나이다.

그러나 그래프에서 1에서 5까지 최단경로로 이동할 수 있는 방법을 찾으려 하고, 그것이 절차적으로 정의된다면 알고리즘이다.

자료구조와 알고리즘은 서로 떼어놓을 수 없는 관계이다. 효율적인 자료구조가 있어야 효율적인 알고리즘 설계가 가능해지고, 효율적인 알고리즘은 효율적인 자료구조 위에서 가능해진다.

따라서 이 시리즈에서는 자료구조와 알고리즘이라는 용어를 그때그때 따로 분리해가며 설명하지 않고 함께 섞어 사용할 것이다.

커리큘럼

사용 언어는 포인터를 통해 자료들이 어떻게 서로를 연결하는지 볼 수 있도록 도와주는 C++이며, 본격적으로 포인터가 필요한 연결 리스트부터의 모든 이론들은 객체지향적 설계의 기초인 class를 기반으로 추상화되고 상세화될 것이다.

참고 서적은 아래와 같다.

저작권법 준수를 위해 강의 자료는 필자가 직접 피그마를 활용해 제작할 계획이다.

시리즈 순서는 위 서적과 필자가 수강한 자료구조 학부 강의를 참고하여 구성하였다. (교수님께 허락을 받음!)

모두가 이해할 수 있게 하기 위해 최대한 자세히 설명했다. 따라서 전반적으로 내용이 길 수 있으니 스스로 필요한 부분을 잘 뽑아갔으면 좋겠다.

요구되는 지식

  • C++ 문법 기초(데이터 타입, 배열, 조건문, 반복문)
  • C++ 포인터(Pointer) 변수에 대한 이해
  • C++ 동적 할당에 대한 이해
  • C++ class 기초
  • C++ vector에 대한 기초적 이해

대부분 학습 중간에도 익힐 수 있으나, 포인터 변수에 대한 이해는 반드시 선행되어야 한다.
다음 챕터인 배열에서 간략히 설명을 하긴 한다.

아래는 포인터에 대한 기초가 어느 정도 생긴 후 보면 개안하듯 이해가 쏙쏙 될 것이다. 필자는 이 짤 덕분에 포인터를 직관적으로 이해할 수 있었다.
짤 하단 atomic 부분부터는 몰라도 할 수 있다.

정확한 정보를 전달하기 위해 최선을 다하고 있지만, 그럼에도 부족함을 알고 있습니다. 언제나 피드백을 기다리고 있으니 잘 부탁드립니다!
감사합니다 :)

profile
코드를 예술로 볼 수 있는가?

0개의 댓글