데이터 스트럭쳐란 무엇인가?

데이터 스트럭쳐란?

A와 B가 있습니다. A의 집은 살림이 없고 B의 집은 살림이 많아 잠잘 공간도 부족합니다. A의 집은 살림이 없으니 책이나 양말을 아무 데나 던져놓아도 금방 찾을 수 있습니다. 반면 B의 집에는 없는 게 없지만, 무언갈 찾으려면 한두 시간이 걸립니다. B는 살림을 줄여야 한다고 생각합니다. 하지만 태생적으로 버리는데 소질이 없는 B는 물건을 쉽게 찾을 방법을 고민했습니다. 물건을 분류하고, 수납 상자에 라벨을 붙여, 라벨의 이름에 따라서 순서대로 상자를 배치했습니다. 이제부터 새로운 살림은 반드시 품명에 맞는 상자에 들어가야 합니다. 이제 물건을 찾는데 걸리는 시간이 훨씬 줄었습니다. B는 마음 놓고 살림을 불릴 수 있습니다. 물건을 찾는데 걸리는 시간이 예전만큼 오래 걸릴 때까지....

여기서 물건은 데이터를 뜻합니다. 물건을 쉽게 찾기 위해서 사용한 수납 상자는 좀 유식한 말로 수납을 정리하는 구조물이라고 할 수 있습니다. 구조물은 영어로 스트럭쳐라고 합니다. 데이터 스트럭쳐는 데이터를 효율적으로 저장하고 꺼내기 쉽게 정리 정돈하는 데 쓰입니다. 데이터 스트럭쳐엔 더 많은 의미가 있지만, 지금은 이 정도 인식으로 출발합니다. 차차 데이터 스트럭쳐를 바라보는 시야를 넓혀갑시다.

사실 데이터 스트럭쳐는 별거 아닙니다. 배열도 데이터 스트럭쳐입니다.

어려운 이유

비유를 조금만 더 해볼까요? A와 B가 서점에 갔습니다. 살림살이를 잘 정리하는 법을 적은 책이 있다고 합시다. 살림이 많은 B는 이 책이 너무 재미있을 겁니다. 자기와 똑같은 사람이 있다는 사실에 위안도 받고 정리 정돈에 대한 탁월한 통찰에 무릎을 치기도 하겠지요. 반대로 A가 이 책을 본다면 재미있을까요? 살림이 없어서 정리 정돈이 필요하지 않은 A는 책을 펼치지도 않을 테지요.

데이터 스트럭쳐도 이와 마찬가지입니다. 데이터 스트럭쳐는 한두 건의 데이터를 처리하기 위해서 고안된 게 아닙니다. 데이터 하나를 1초에 처리할 수 있는 시스템이 있다고 생각해 봅시다. 데이터 10건을 작업하는 데는 10초만 있으면 됩니다. 10초 정도면 인내심을 발휘할 수 있는 시간이지요? 그럼 데이터가 백만 건일 땐 어떨까요. 백만 초가 걸리겠지요. 백만 초는 11일입니다.

대학에서는 주로 데이터 스트럭쳐를 2학년 때 가르칩니다. 프로그래밍을 대학에서 처음 배운 사람이라면 거대한 규모의 데이터를 다뤄본 적이 없을 겁니다. 이런 사람이 데이터 스트럭쳐를 배울 땐 살림이 없는 A가 살림을 잘 정리하는 법을 배우는 듯한 느낌이 들겠죠. 이해하기도 어렵지만, 무엇보다 공감할 수 없습니다. 공감할 수 없으면 자신이 이해하는 바를 의심하게 됩니다. 이해는 흔들리고 자신감이 흔들립니다. 이런 공부는 뇌를 혹사해, 자연스럽게 뇌는 자신이 데이터 스트럭쳐를 할 수 없다고 믿겠죠.

그래서 필자는 데이터 스트럭쳐를 프로그래밍 초심자가 배우는 데에 '살짝' 반대합니다. 하지만 데이터 전문가를 양성해야 할 학교에서 데이터 스트럭쳐를 안 가르칠 수도 없겠죠. 선생님이나 학생이나 딜레마에 빠진 셈입니다. 모두 힘겨운 상황이죠. 저희도 이 문제에 대한 완벽한 해답을 찾진 못했습니다. 하지만 어떻게 하면 뇌를 혹사하지 않고 흥분시킬 수 있을까**에 대한 고민을 여기에 담기 위해 노력할 겁니다.

어떻게 공부할까?

한편으로 공부에 참여하시는 분에게 부탁하고 싶은 바가 있습니다. 왜 똑같은 책을 A는 재미없고 B는 재미있게 읽을까요? 재미는 결국 자기 마음속에 있기 때문이겠지요. 재미는 공감에서 출발한다 생각합니다. 여러분이 대규모 시스템을 다뤄본 적이 없다는 걸 저희도 알고 있습니다. 하지만 여러분에게는 상상력이 있습니다. 자신을 데이터를 수억 건 처리하는 엔지니어라고 상상해보세요. 시스템을 잘 설계해 많은 사람이 야근 없이 가족과 행복한 시간을 보낸다고 생각해 보세요. 시스템을 효율적으로 만드는 일이 얼마나 가치 있는 일인가요? 데이터 스트럭쳐는 여러분이 이런 엄청난 일을 할 수 있게 도와줍니다. 데이터 스트럭쳐는 선배 개발자들이 평생을 바쳐 만든 지혜의 산물입니다. 누군가 평생을 매달린 일은 당사자에게는 재미있어서 견딜 수 없는 일이었을 겁니다. 그 즐거움을 느낄 수 있도록 끊임없이 상상해보셨으면 좋겠습니다.

노력했지만 이해하지 못할 수 있습니다. 하지만 이해를 못 하는 게 여러분의 탓은 아닙니다. 데이터 스트럭쳐를 글 또는 말로 전달하고, 이를 수용하긴 쉽지 않습니다. 이해할 수 없다면 뇌를 혹사하지 말고 먼저 경험을 쌓은 후 이곳을 다시 찾아주세요. 포기하지 말고 유보하세요. 포기와 유보는 분명히 다릅니다. 포기가 수동적인 행위라면 유보는 적극적으로 다음을 기약하는 행동입니다. 과감하게 유보하세요. 대신 정기적으로 두드리세요. 언젠가는 열립니다.

사랑하면 알게 되고 알면 보이나니 그때 보이는 것은 전과 같지 않으리라

※ 본 코스 - 자바로 배우는 자료구조(with 생활코딩) - 에 포함된 글은 opentutorials(생활코딩)의 자료구조 강의의 강의 노트를 편집한 글입니다.

강의에 등록된 질문이 없습니다. 궁금한 부분이 있으면 주저하지 말고 무엇이든 물어보세요.