데이터 스트럭쳐란?
A와 B가 있습니다. A의 집은 살림이 없고, B의 집은 살림이 많아서 잠잘 공간도 부족합니다. A의 집은 살림이 없기 때문에 책이나 양말을 아무 데나 던져놓아도 금방 찾을 수 있습니다. 하지만 B의 집에는 없는 게 없지만 무엇 하나 찾으려면 한 두 시간이 걸립니다. B도 살림을 줄여야 한다는 것을 알고 있습니다. 하지만 태생적으로 버리는 것에는 소질이 없기 때문에 B는 물건을 쉽게 찾을 방법들을 고민했습니다. 물건들을 분류하고 수납상자를 구입했습니다. 거기에 라벨을 붙이고 라벨의 이름에 따라서 순서대로 상자를 배치했습니다. 이제부터 새로운 살림이 들어오면 반드시 그 품명에 맞는 상자에 들어가야 합니다. 그 덕에 물건을 찾는데 걸리는 시간이 훨씬 줄어들었습니다. B는 마음놓고 살림을 불릴 수 있었습니다. 물건 찾는데 걸리는 시간이 예전만큼 오래 걸릴 때까지....
여기서 물건은 데이터를 의미합니다. 물건을 쉽게 찾기 위해서 사용한 수납상자는 좀 유식한 말로는 수납을 정리하는 구조물이라고 할 수 있습니다. 영어로는 구조물을 영어로는 스트럭쳐라고 합니다. 데이터 스트럭쳐는 데이터를 효율적으로 저장하고 꺼내기 쉽게 만드는 것을 의미합니다. 꺼내쓰기 쉽게 데이터를 잘 정리 정돈하는 것이라고 할 수 있습니다. 더 많은 의미가 있지만 지금은 이 정도 인식으로 출발하면 됩니다. 차차로 데이터 스트럭쳐를 바라보는 시야를 넓혀갑시다.
사실 데이터 스트럭쳐가 별거는 아닙니다. 거의 모든 언어에 있는 배열은 대표적인 데이터 스트럭쳐라고 할 수 있습니다.
어려운 이유
위에서 사용한 비유를 조금만 더 사용해볼까요? A와 B가 서점을 갔습니다. 두 사람이 각자 살림살이 잘 정리하는 법에 대한 책을 읽는다고 생각해볼까요? 살림이 많은 B는 이 책이 너무 재미있을 것입니다. 자기와 똑같은 사람이 있다는 것에 위안도 얻고 정리 정돈에 대한 탁월한 통찰에 무릎을 치기도 하겠죠. 반대로 A가 이 책을 본다면 재미있을까요? 살림이 없어서 정리 정돈이 필요하지 않은 A는 책을 열어보지도 않았을 것입니다.
데이터 스트럭쳐도 마찬가지 입니다. 이것은 한 두건의 데이터를 처리하기 위해서 고안된 것이 아닙니다. 1건의 데이터를 1초에 처리할 수 있는 시스템이 있다고 생각해 봅시다. 데이터가 10건이라면 10초만에 끝나는 작업입니다. 10초 정도면 인내심을 발휘 할 수 있는 시간이지요? 이번엔 데이터가 백만건이라고 가정해 봅시다. 백만초가 걸릴 것입니다. 이것을 일로 환산하면 11일이 걸리는 작업이 됩니다.
대학에서는 데이터 스트럭처를 2학년 때 주로 배우게 됩니다. 프로그래밍을 대학에서 처음 시작한 사람이라면 거대한 규모의 데이터를 다뤄본 경험이 없을 것입니다. 그런 상황에 있는 사람이 데이터 스트럭처를 배우는 것은 살림이 없는 A가 살림 정리를 잘하는 법을 배우는 것과 비슷합니다. 이해도 어렵겠지만, 무엇보다 공감하기가 어렵습니다. 공감할 수 없으면 자신이 이해하고 있는 것에 의심을 품게 됩니다. 이해는 흔들리게 되고 자신감은 감퇴합니다. 이런 상태에서 하는 공부는 뇌를 혹사시키는 결과를 낳게 됩니다. 자연스럽게 뇌는 데이터 스트럭처를 자신이 할 수 없는 것이라고 믿게 되겠죠.
그래서 필자는 데이터 스트럭처를 프로그래밍 초심자가 배우는 것에 대해서 '살짝' 반대합니다. 하지만 데이터 전문가를 양성것을 목표로하는 학교에서 이것을 가르치지 않는다는 것은 또한 문제입니다. 선생님이나 학생이나 이러한 딜레마의 고충 속에서 공부를 하고 있는 셈입니다. 선생님도 학생도 모두 힘겨운 상황인 것이죠. 이러한 현실적인 문제에 대한 완벽한 해답은 저희도 찾지는 못했습니다. 하지만 어떻게 하면 뇌를 혹사시키는 것이 아니라 흥분시킬 것인가에 대한 고민을 여기에 담기 위해서 노력할 것입니다.
어떻게 공부할 것인가?
한편으로 공부에 참여하시는 분에게도 부탁하고 싶은 것이 있습니다. 똑같은 책이 A는 재미없고 B는 재미있는 이유가 무엇일까요? 그것은 재미라는 것이 결국 자기 마음속에 있기 때문일 것입니다. 재미를 느끼는 것의 출발점은 아마도 공감일 것입니다. 여러분이 대규모 시스템을 다뤄본 적이 없다는 것을 저희도 알고 있습니다. 하지만 여러분에게는 상상력이란 도구가 있습니다. 자신이 수억건의 데이터를 처리하는 엔지니어라고 상상해보세요. 자신이 시스템을 잘 설계한다면 많은 사람들이 야근 없이 가족과 행복한 시간을 보낼 수 있다고 생각해 보세요. 시스템을 효율적으로 만드는 일이 얼마나 가치 있는 일인가요? 데이터 스트럭처는 여러분이 이러한 엄청난 일을 할 수 있게 도와줍니다. 데이터 스트럭쳐는 선배 개발자들이 평생을 바쳐서 노력한 지혜의 산물입니다. 누군가가 평생을 매달린 일이 있다면 그 일은 그 당사자에게는 재미있어서 견딜 수 없는 그런 일이었을 것입니다. 그 즐거움을 자신도 느낄 수 있도록 끊임없이 상상해보셨으면 좋겠습니다.
노력했지만 이해가 가지 않을 수 있습니다. 하지만 분명한 것은 이해가 가지 않는 것이 여러분의 탓은 아니라는 것입니다. 데이터 스트럭쳐를 글이나 말로 전달하고 수용하는 것은 쉬운 일이 아닙니다. 이해가 되지 않는다면 뇌를 혹사시키지 마시고 일단 현장의 경험을 쌓은 후에 틈틈이 이곳을 다시 찾아주세요. 이것은 포기가 아닙니다. 유보 입니다. 포기와 유보는 분명히 다른 것입니다. 포기가 수동적인 것이라면 유보는 적극적으로 다음을 기약하는 것입니다. 과감하게 유보하세요. 대신에 정기적으로 두드리세요. 언젠가는 열릴 것입니다.
"사랑하면 알게 되고 알면 보이나니 그때 보이는 것은 전과 같지 않으리라"