[CS기초] 자료구조란?

talkingBeans·2022년 1월 15일
0

[CS]자료구조

목록 보기
1/1
post-thumbnail

서론

처음으로 코딩의 세계에 접한 여러분들은 수많은 강의를 알아보고 시작할겁니다.
그리고 대부분의 강의는 여러분이 손쉽고 빠르게 코딩의 재미를 이끌어 낼 수 있도록 코드를 그대로 따라치는 Clone Coding이나 앱, 웹 등을 쉽게 만들 수 있는 프레임워크를 먼저 사용하는 두괄식 강의를 많이 보게 될겁니다.
여러분이 어느정도 그렇게 여러 강의를 걸쳐서 이 포스팅을 보게 됐다면 제가 이제부터 하는 말에 공감하고 포스팅을 모두 보게 되겠죠.
위 상황과 다르게 들어왔더라도 보고난다면 처음에는 이해하지 못하더라도 나중에는 제 말에 대해서 공감할 수 있을 겁니다.

자료구조

흔히들 이야기하는 Data Structure, Data Architecture, 혹은 강의 중에서는 배열, 리스트, 큐, 스택, 등등 어느정도 코딩을 접하신 분들에게는 익숙하게 들어오신 개념들입니다. 그렇다면 자료구조는 왜 사용하고, 어떻게 사용하는지에 대해서 이야기해보겠습니다.

자료구조에 대한 중요성은 많이들 이야기합니다. 여러분들이 만약에 비 전공자에서 이쪽 계통으로 취업하기든 아니면 전공자이면서 취업을 진행하시더라도 자료구조를 모르고서는 기본적인 알고리즘 문제를 푸는데 있어서 많은 시간이 소요될 가능성이 매우 높습니다. 그리고 이론적으로나 실무적으로나 활용 수단과 가능성이 굉장이 높은 개념이므로 집중해서 보시고, 정리하시면 됩니다.

여러분들이 코딩강의를 어느정도 보신 분들이라면 Python의 Dict, Java의 List, Queue, Stack, 혹은 JSON과 같은 데이터 포맷, Graph, Tree 등등 많은 형태의 자료구조를 은연 중에 다 보시고 사용하셨을겁니다. 하지만 모르고 그대로 따라해서 사용하는 것과 정확히 알고 사용하는 것은 큰 차이가 있죠.

잘 알고 있는 상태에서 사용한다면 여러분들은 자료구조를 어떤 상황에 사용해야할지 알고 있다는 뜻이고, 그렇게 되면 전체적 논리설계가 굉장히 간결하고, 단단하게 만들어져서 실제 개발에 들어갔을때도 빠르고 안전한 코드를 만들 수 있을 겁니다. 설계가 제대로 됐다면, 스파게티 코드* 현상은 거의 없을테니 말이죠.

저는 Javascript와 파이썬 C, Java 모든 언어를 써봤지만 현재 가장 많이 사용하고 있는 주 언어는 Javascript이므로 Javascript위주로 설명을 드리도록 하겠습니다. 혹시나 javascript를 안배우셨더라도 의사코드*를 최대한 남겨드릴테니 보고 참고하시면 되겠습니다.

Why?

그러면 왜 자료구조인가?

  • 위키백과 자료구조 대표 이미지 - hash Table

위의 이미지는 왜 사용하냐 하면 용도가 다양하기 때문에 모든 내용을 다 설명하기 어렵지만 단적인 예로 들어보자.

쉽게 생각해봅시다, 위 예제를 그대로 따라가보겠습니다. 여러분의 휴대폰에 번호를 저장하면서 저장한 번호의 이름과 여러 정보를 같이 기입해서 보관하고 있죠?

그리고 연락처에서 이름을 검색하면 이름에 해당하는 번호를 정보로 얻을 수 있습니다.
해쉬 테이블은 이런 key를 통해서 내가 원하는 value를 찾아는데 있어서 굉장히 수월하게 일을 해낼 수 있도록 도와주는 자료구조입니다.

위에 보시면, John Smith 문자열을 hash function에 인자로 넘겨준다면, 테이블 안에 02번에 있는 521-1234를 반환해줍니다, 이렇게 key를 통해서 value를 찾는 자료구조는 python에서 dictionary 자료형과 동일하죠.

만약 데이터를 저장해야하는데, 값을 찾기위한 방법으로 key를 이용해야한다면 이러한 방법을 통해서 자료구조를 만들어서 사용하면, 개발하는데 있어서 훨씬 편리하게 개발할 수 있을겁니다.

공감을 얻기는 많이 어려울 수도 있지만 운영체제에서 이런 자료구조 기법들을 다양하게 활용하는 편입니다, AI에서도 물론이죠. 어떤 것들을 활용하는지 예를 한번 들어보죠.

우리가 사용할 수 있는 자원은 한정돼있습니다. 지구상에 있는 모든 자원은 한정되어있듯 컴퓨터 내에서도 마찬가지입니다. 여러분들이 알고있는 메모리라는 저장장치는 한정된 메모리를 가지고 있죠. 그렇다면 이 메모리를 어떻게 효율적으로 사용하는가에 따라서 큰 성능차이를 보일겁니다. 그냥 새로운 작업이 들어오면 바로바로 메모리에 때려박게 된다면, 메모리를 효율적으로 사용하는 것이 아니겠죠, 누가 먼저 메모리를 얼만큼 사용할건지 사용이 끝날때까지 기다릴지, 먼저 작업한 녀석이 우선순위가 이후 들어온 것보다 낮아서 메모리를 빠져나와야한다는 등등 굉장히 많은 변수가 존재합니다.

그러면 가장 간단 방법인 선입선출을 생각해봅시다.(FIFO : First In First Out) 즉 먼저 들어간 것이 먼저 빠져나오게하는 방법입니다.

  • FIFO의 대표적 그림

Queue 자료구조 형태를 띄고 있는데, 맨 마지막에 들어온 데이터는 뒤로가고, 맨 앞에 있던 데이터가 빠져나오는 모습을 띄고 있습니다. 이것도 자료구조의 하나의 형태인데, 데이터가 뒤에서부터 하나씩 쌓이는 형태이므로 맨 처음 들어온 데이터가 가장 먼저 빠져나갈 수있게끔하는 형태이죠, 물론 작업이 모두 끝났다는 가정하에 자료구조에서 빠져나가는 형태입니다. 모든 queue가 꽉찼다면 새로운 데이터는 못들어오는거죠.

queue 자료구조가 없다는 가정하에 FIFO를 만든다고 생각한다면, 조금 꼬이긴 하겠지만 만들 수는 있을겁니다. 하지만 처음에도 이야기했듯이 설계를 잘하면, 이후 코드수정을 할 일이 많이 줄어든다는게 중점이고 그렇기 때문에 꼬인 코드를 만들지 않기 위해 자료구조를 사용한다고 보면 됩니다.

정확히는 자료를 저장하고 수정 관리를 할 때, 최적화된 자료구조를 선택하고 사용하는 능력을 기르는게 중요한 것이지만, 일단 그렇게 하기 위해서는 자료구조를 알아야하겠죠.

자 이제 왜 자료구조를 사용해야하는지 알겠죠? 데이터를 효율적으로 관리하고 사용하고 수정하기 위해 자료구조를 쓴다고 보시면 됩니다.

How?

그러면 어떻게 쓰면 좋을까요?

이 질문에 대한 대답은 상당히 어렵습니다. 어떤 상황에서 어떤 자료구조를 사용해야 효율적이다! 이게 정답이다! 하는건 없으니까요. 물론 다수가 인정하는 효율적인 자료구조 사용법은 따로 있습니다. 어떤 상황에서는 이런 시간 복잡도를 가진 자료구조를 사용하는게 옳다 아니다... 말이 어렵죠?

여러분들이 판단하고 사용하는게 제일 좋습니다. 먼저 자료구조의 대표적인 종류를 알고, 어떤 구조를 가지고 있는지 올바르게 공부해야지만, 상황에 따라서 사용하는 방법을 알 수 있습니다.

지금 코딩 공부를 계속해서 하고 있다면, 자료구조 종류에 대해서 공부하고 프로그래머스와 같은 코딩 문제를 푸는 사이트에서 자료구조 종류에 따른 문제들을 풀어보는게 가장 효율적으로 공부할 수 있는 방법이라고 말할 수 있겠네요. (물론 필자의 입장에서 입니다.)

https://www.oreilly.com/

또 하나의 방법으로는 oreilly라는 사이트에서 책을 찾아서 공부하는걸 추천합니다만, 여러 인터넷 강의를 보면서 공부해도 좋습니다.

코딩을 공부하는데 있어서 명확한 정답이 존재하고, 그 정답을 따라갈 수 있다는건 없습니다. 자연과학의 입장에서 생각해볼까요? 우리가 알고 있는 모든 과학적 사실들은 정말 정답이 존재할까요? 오히려 과학자들은 새로운 사실이 발견되거나 기존 사실에 대해서 항상 의문을 품습니다. 이게 정말 올바른 방법인가? 정답인가?

코딩도 마찬가지라고 보시면 됩니다. 이렇게 해라 저렇게 해라 정답은 없습니다. 본인이 공부하고, 타인과 공유하고 대화나 협업을 통해서 모두가 알아듣기 쉽고 이해하기 쉬우면서 잘 사용할 수 있는 코드를 만들기 위해서 노력해야하죠.

자료구조는 어떻게 쓰면 잘 쓸까? 어떻게 쓰면 좋을까? 의문이 들기 시작했다면 잘된겁니다. 이제부터 그 자료구조에 종류에 대해서 공부하고, 그 자료구조들을 활용할 방법을 찾으면 되니까요.

이번 포스팅에서는 자료구조는 어떤것이고 왜 쓰는지에 대해서 배웠으니, 다음 포스팅에서는 자료구조의 종류와 종류에 따른 사용 상황에 대해서 조금씩 기재해보도록 하겠습니다.

profile
진화 중인 말하는 콩

0개의 댓글