Data Structure (자료구조)

비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

Data Structure (자료구조) 비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

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

데이터 스트럭쳐란?

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

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

사실 데이터 스트럭쳐가 별거는 아닙니다. 거의 모든 언어에 있는 배열은 대표적인 데이터 스트럭쳐라고 할 수 있습니다. 

어려운 이유

위에서 사용한 비유를 조금만 더 사용해볼까요? A와 B가 서점을 갔습니다. 두 사람이 각자 살림살이 잘 정리하는 법에 대한 책을 읽는다고 생각해볼까요? 살림이 많은 B는 이 책이 너무 재미있을 것입니다. 자기와 똑같은 사람이 있다는 것에 위안도 얻고 정리 정돈에 대한 탁월한 통찰에 무릎을 치기도 하겠죠. 반대로 A가 이 책을 본다면 재미있을까요? 살림이 없어서 정리 정돈이 필요하지 않은 A는 책을 열어보지도 않았을 것입니다.

데이터 스트럭쳐도 마찬가지 입니다. 이것은 한 두건의 데이터를 처리하기 위해서 고안된 것이 아닙니다. 1건의 데이터를 1초에 처리할 수 있는 시스템이 있다고 생각해 봅시다. 데이터가 10건이라면 10초만에 끝나는 작업입니다. 10초 정도면 인내심을 발휘 할 수 있는 시간이지요? 이번엔 데이터가 백만건이라고 가정해 봅시다. 백만초가 걸릴 것입니다. 이것을 일로 환산하면 11일이 걸리는 작업이 됩니다. 

대학에서는 데이터 스트럭처를 2학년 때 주로 배우게 됩니다. 프로그래밍을 대학에서 처음 시작한 사람이라면 거대한 규모의 데이터를 다뤄본 경험이 없을 것입니다. 그런 상황에 있는 사람이 데이터 스트럭처를 배우는 것은 살림이 없는 A가 살림 정리를 잘하는 법을 배우는 것과 비슷합니다. 이해도 어렵겠지만, 무엇보다 공감하기가 어렵습니다. 공감할 수 없으면 자신이 이해하고 있는 것에 의심을 품게 됩니다. 이해는 흔들리게 되고 자신감은 감퇴합니다. 이런 상태에서 하는 공부는 뇌를 혹사시키는 결과를 낳게 됩니다. 자연스럽게 뇌는 데이터 스트럭처를 자신이 할 수 없는 것이라고 믿게 되겠죠. 

그래서 필자는 데이터 스트럭처를 프로그래밍 초심자가 배우는 것에 대해서 '살짝' 반대합니다. 하지만 데이터 전문가를 양성것을 목표로하는 학교에서 이것을 가르치지 않는다는 것은 또한 문제입니다. 선생님이나 학생이나 이러한 딜레마의 고충 속에서 공부를 하고 있는 셈입니다. 선생님도 학생도 모두 힘겨운 상황인 것이죠. 이러한 현실적인 문제에 대한 완벽한 해답은 저희도 찾지는 못했습니다. 하지만 어떻게 하면 뇌를 혹사시키는 것이 아니라 흥분시킬 것인가에 대한 고민을 여기에 담기 위해서 노력할 것입니다.

어떻게 공부할 것인가?

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

노력했지만 이해가 가지 않을 수 있습니다. 하지만 분명한 것은 이해가 가지 않는 것이 여러분의 탓은 아니라는 것입니다. 데이터 스트럭쳐를 글이나 말로 전달하고 수용하는 것은 쉬운 일이 아닙니다. 이해가 되지 않는다면 뇌를 혹사시키지 마시고 일단 현장의 경험을 쌓은 후에 틈틈이 이곳을 다시 찾아주세요. 이것은 포기가 아닙니다. 유보 입니다. 포기와 유보는 분명히 다른 것입니다. 포기가 수동적인 것이라면 유보는 적극적으로 다음을 기약하는 것입니다. 과감하게 유보하세요. 대신에 정기적으로 두드리세요. 언젠가는 열릴 것입니다.

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

댓글

댓글 본문
  1. Gili
    Completed 25/07/22
  2. 이마누
    완료
  3. HyunChul Joh
    "사랑하면 알게 되고 알면 보이나니 그때 보이는 것은 전과 같지 않으리라"
  4. 머램이
    감사합니다!
  5. SangHyeok Kim
    2017/03/30 수강완료!
  6. 임지호
    자료 구조 :
    1. 현실의 문제를 프로그래밍적으로 표현하는 것
    2. 많은 양의 데이터를 효율적으로 관리하기 위한 것
    적은 양의 데이터로는 자료구조의 힘을 체감할 수 없기 때문에 초심자는 공감도 안되고 이해도 안된다.
    어느 정도 경험이 쌓여야 자료구조의 필요성을 체감하고 이해도 될 것이다.
  7. 학부생
    좋은 글 감사합니다.
  8. 악상
    이글은 도대체 개발자는 쓴것입니까? 아니면 베스트 셀러 작가가 쓰신것입니까? 개발자의 마음을 어찌 쏙쏙 들이 알고서 단어 선정도 정말 기가 막히게 했나요..
  9. Hyebin Park
    힘이되네요! 감사합니다.
  10. 지류진
    감사합니다
  11. 도로도로
    넵!!
  12. KimKI
    잘 보고 있습니다. 설마 자료구조까지 있을까해서 찾아봤는데 만들어주셔서 감사합니다^^
    근데 오타가 있네요. '대전재'->'대전제' 중요하진 않지만 그냥 적어보아요
  13. bepositive1223
    경험을 더 쌓으면 된다고 하셨는데...
    그 경험이라는 것이 무엇을 말하는 것인가요?

    현재 진행되고 있는 데이터스트럭처 강의를 듣다가 이해가 안된 부분(유보된부분)으로 다시 돌아와서 이해해보라는 것인가요??
  14. 하승현
    잘읽었습니다^^
  15. bibi
    it was excellent orientation for data structure. I am lucky to take this online course!
  16. 임경수
    아주 좋습니다. 목소리가 편안해서 다른 동강도 꾸준히 듣고 있습니다
    항상 감사합니다~!!!
  17. egoing
    화이팅이예요~
    대화보기
    • egoing
      후기와 제안 모두 10초급 입니다!
      대화보기
      • 세줄
        데이터 구조론을 공감못했던 이유를 정확히 집어주신것같습니다. 학생때 A 타입이었던 저역시 공감을 하지못하니 재미가 없었고 손을 놨던것같습니다. "10초 밖에안걸리는 시스템에선 동감이 안되지만 1백만초가 걸리는 시스템에선 반드시 필요하다" 이부분이 정말 와 닿았습니다. 문득 글을 읽으면서 생각난 부분이 있습니다.

        1백만초가걸리는 가상의 데이터의 시스템을 구축해두고 점차 빨라지는 시스템을 구축해본다면
        완벽하게 이해 하지 않을까 싶습니다.

        데이터 구조에대한 설명 너무 감사합니다 !
      • egoing
        고맙습니다. ^^
        대화보기
        • 김재영
          아. 설명이 너무 재미있네요. 저도 모르게 이고잉님 멘트를 입밖으로 따라하면서, 노트에 정리하면서 잘 듣고 있습니다. 좋은 강의 감사드립니다. ^^
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기