Table of contents
자료구조란?
자료구조란 무엇일까? 개인적으로 어떤 키워드를 처음 접했을 때 그 뜻을 바로 검색해보지 않고, 먼저 그 단어 자체에 있는 단서로부터 유추하는 것을 좋아한다. "자료구조"에 이 방법을 적용해봤다.
"자료구조"를 약간 풀어서 쓰면 "자료의 구조"다. 갑자기 "구조"라는 단어가 낯설게 느껴진다면 "신체구조"를 떠올려보자. 누군가 당신에게 인간의 신체구조에 대해 물어본다면 뭐라고 어떻게 대답할 것인가? 인간의 신체를 이루는 손, 발, 심장 등 구성요소들에 대해 말하고 각 구성요소들이 어떤 기능을 하며 어떻게 수행하는지를 말할 것이다.
즉, "구조"를 공부한다는 것은 어떤 대상의 내부적으로 서로 연결되어 있는 요소들의 관계 및 형태, 그리고 그 대상의 기능들과 동작 원리에 대해서 공부하는 것이다.
이번에는 "건물 구조"를 생각해보자. 건물은 기초, 기둥, 벽, 바닥, 천장 등으로 구성되고, 보통 환경(기후, 지반 등), 비용, 목적에 따라 단독 주택, 아파트, 고층 빌딩 등 다양한 건물들을 짓는다. 이러한 건물들은 각기 다른 구조와 설계를 갖고 지어지게 되는데, 모든 건물들이 공통적으로 고려해야 하는 중요한 사항이 있다. 바로 안정성이다.
건물 구조는 자료 구조와 비슷한 점이 많다. 상황에 따라 배열, 스택, 큐, 트리 등 다양한 자료구조들 중에서 선택한다. 즉, 데이터를 효율적으로 사용하기 위해 자료를 어떻게 관리할지를 정하는 것이다.
맨 위에 이 글 커버 사진에 있는 건물은 갓쇼즈쿠리라는 일본의 건축양식인데, 눈이 지붕 위에 쌓이지 않게 하기 위해 지붕의 경사가 아주 가파르다. 폭설이 잦은 시라카와고 마을에서는 매우 적합하지만, 빌딩이 들어오기로 예정되어 있던 눈이 하나도 오지 않는 곳에 이 집을 짓는다면 공간 낭비에 그 땅의 본전도 못 건질 것이다.
자료구조도 마찬가지로 어떤 곳에서든 정답인 구조가 있는 것이 아니라 내가 다뤄야 하는 데이터가 어떤 특징(타입, 크기 등)을 갖고 있는지, 가용 메모리 크기, 이 데이터를 어떻게 사용할지 등을 고려하여 적합한 구조를 선택해야 한다.
그럼 자료구조를 왜 공부해야 할까?(작성중)
자료구조를 공부해야 하는 첫번째 이유는 앞서 언급한 것처럼 상황에 맞는 자료구조를 골라야 하기 때문이다. 어떤 자료구조가 있고, 각각의 특징이 무엇인지 모른다면 선택이라는 표현보다는 찍는다라는 말이 좀 더 정확할 것 같다.
두번째 이유는 코드를 다루면서 자료구조를 절대 피할 수 없다는 것이다. 아마 리스트나, 해시 테이블의 구현체들을 다들 이미 숨쉬듯 쓰고 있을 것이다. 대부분의 언어가 이런 구현체들을 표준으로 지원해주고 있다. 또, 이미 많은 사람들이 그런 자료구조들을 이용해서 코드나 라이브러리 등을 만들어 왔다는 것이다.
세번째, 에러의 원인에 대한 이해도를 높일 수도 있다. StackOverflowError에서 Stack도 자료구조다.
네번째, 성능을 개선시킬 수 있다. 다음 상황을 가정해보자. 어떤 식당에 사람들이 밥을 먹기위해 번호표를 받아 기다리고 있다. 우리는 다음 차례인 손님을 찾기 위해 "n번 손님!!"하고 호명(출력)하는 프로그램을 만들어야 한다. 그런데 한가지 문제가 있다. 하필 오늘따라 밥을 당장 먹지 못하면 쓰러질 것 같은 손님들이 많아 이탈률이 너무 높은 것이다. 이 때 호명할 번호표들을 어떤 자료구조로 구현할것인가?
이 답은 차차 알아보자