}

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate on the chrome↓↓↓===***===>

2020년 4월 12일 일요일

자료구조란? 자료구조를 배우는 이유! 자세하게!!


안녕하세요 마무입니다. 오늘은 "자료구조란?", "자료구조를 배우는 이유", "알고리즘 뜻" 등등 왜? 컴퓨터 관련 전공이라면 필수로 자료구조를 배워야하는지와 자료구조의 "선형 구조"와 "비선형 구조"를 가볍게 알아보겠습니다.

--목차--

1. 알고리즘과 자료구조의 정의 및 배워야하는 이유

2. 자료구조의 종류

----------

더 궁금한 것이 있으시면
홈페이지 : https://mamu2830.blogspot.com/p/blog-page_23.html
에서 한번 찾아보세요!




1. 알고리즘과 자료구조의 정의 및 배워야하는 이유


"자료구조(data structure)"를 알기전에 먼저 "프로그램"에 대해서 먼저 정확히 이해하고 넘어갑시다.

"프로그램"은 크게 "알고리즘(Algorithm)" + "자료구조(data structure)"라고 합니다.
이렇게 표현하니 되게 어렵게 느껴지는데 그냥
"알고리즘"이란 "어떠한 목적을 위해 어떻게 코드를 구성할지"이고
"자료구조""데이터를 어떻게 저장하고 어떻게 꺼내올 것인가" 입니다.

더 쉽게 표현하자면 "데이터를 구체적으로 사용하는 방법""데이터를 저장하고 꺼내는 방식"이죠.

그래서 프로그래밍을 하는데, 자료구조를 모른다? 이거는 마치 건물을 지을려고 하는데 건물 디자인과 청사진을 다 만들어놓고, 벽돌은 어떻게 쌓을 지 모른다는 것과 같은 말이죠.

뭐 간단히 printf("hello, world"); 와 같이 어떤 글을 화면에 출력하는 매우 매우 단순한 프로그램이라면 굳이 데이터를 저장할 필요가 없겠지만, 우리가 생각하는 실제 프로그램 수준은 무조건 "자료구조"가 필요합니다.

제가 프로그래밍을 할려면 "자료구조"무조건 있어야 한다는 느낌으로 말하니,  "자료구조"를 배워본 적은 없지만 나름 프로그래밍 언어를 배우면서 어느정도 프로그램이란 걸 만들어본 사람들은 이렇게 생각이 들겁니다.

'뭐지.. 그럼 내가 지금까지 만들어온 프로그램은 프로그램도 아니라는 건가?' 하는 회의가 말이죠.

아닙니다 당연히 프로그램 맞습니다! 단지 우린 "자료구조"라는 건지 모르고 자연스럽게  프로그래밍을 배우면서 사용해 왔을 뿐이죠.

그중 하나가 바로 "배열(Array)" 입니다.

"배열(Array)"이 뭐였습니까? 같은 데이터형식의 데이터를 순서대로 메모리상에 저장하는 거였죠?

int a[10] = {1,2,3,4,5,6,7,8,9,10}; 
이렇게 하면 4바이트의 정수를 위한 공간 총 10개가 연속적으로 메모리에 배치가 됐고
"a[0], a[1], a[2]... a[9]"에 각각 "1, 2, ....,10"이란 값이 넣어졌죠.

"차례차례" 말이죠.
이렇듯 "차례차례" 데이터를 저장하는 "배열"은 마치 일직선으로 데이터를 저장한다고 해서 "선형(직선 모양, linear) 구조" 라고 합니다.



이렇게 말이죠.

그러나 프로그래밍을 배우면 배울 수록 한계에 도달합니다. 아마 C언어만 배운 1학년때
다들 경험하셨을 겁니다.

뭔가 내가 생각하는 프로그램을 만들려 하는데, 뭔가 부족한 느낌이며 만들지 못하는 느낌을 말이죠.

물론 알고리즘에 대한 지식과 경험이 부족해서 이기도 합니다만, 알고있는 기초적인
자료구조의 한계죠.

이렇듯 아무리 뛰어난 알고리즘(데이터를 사용하는 방법)코드를 짠다고 해도 효율적인 
"자료구조"가 없으면 그저 오래걸리고 비효율적인 프로그램이 됩니다.

그래서 저희는 수십 년간 수 많은 사람들이 지금까지 프로그램을 만들어 사용하면서 '어떤 목적의 프로그래밍을 할 땐 이런 식으로 데이터를 저장하고 사용하면 더 빠르고 좋더라~' 하는 그런 "노하우(knowhow)"들을 집약한 기술들을 우린 "자료구조(data structure)"라고 하며 배우는 겁니다.

정리해서 이 "자료구조"란 프로그래밍을 할 때 필요한 데이터를 다루는 "노하우(knowhow)"이자 "고급기술"을 배우는 것으로, 높은 수준의 프로그램을 만들기 위해선 반드시 배워야 하는 과정인 것이죠.

또한 프로그래밍 뿐만 아니라 컴퓨터계열이면 "운영체제"라는 것도 필수로 공부를 하게 되는데, 이 때 자료구조의 지식이 없으면 이해가 너무 힘듭니다.

왜냐면 "운영체제""C언어와 자료구조 지식"기본 배경으로 깔려 있어야 이해가 되는 내용이기 때문이죠.





2. 자료구조의 종류



자 그럼 이제 "자료구조"라는 개념과 필요성을 알았으니 그 잘난 "자료구조"란게 도대체 무슨 종류가 있는지 한번 가볍게 봐봅시다.

각 기술들에 대해서 자세히 알아보는 건 나중에 다른 포스트로 다루겠습니다.
지금은 '아~ 자료구조란 이런 것들이 있고 이런 프로그램에 이미 쓰여왔구나~' 정도만
알고 넘어갑시다!

"자료구조"는 크게 앞서 언급한 "선형 구조(linear structure)"와, "비선형 구조(nonlinear structure)"로 나눠집니다.

"선형 구조(linear structure)" 말 그대로 "선" 모양처럼 순차적으로 데이터를 저장하는 방식을 말합니다. 즉 하나의 데이터 바로 다음에 또 다른 하나의 데이터가 있는 1:1 구조라는 것이죠.

"선형 구조"에는
제일 익숙한 연속된 기억장소에 데이터를 저장하는 "선형 리스트(linear list) 또는 배열" 

다음 데이터 위치를 가리키는 포인터를 이용하는 "연결 리스트(Linked list)" 

메모리관련 내용에서 자주 보이는 "스택(stack) 또는 LIFO(Last In First Out)" 

운영체제가 어떤 프로세스를 먼저 실행(CPU를 할당)할지 작업 스케줄링에 사용되는
"큐(Queue) 또는 FIFO(First in First Out)"가 있습니다.

일단 참 웃기게도 "운영체제"에 대한 공부를 하려면 위에 언급한 "연결 리스트, 스택, LIFO, 큐, FIFO" 모두 기본적으로 알고 있어야 합니다.


그리고 "비선형 구조(nonlinear structure)" "선"이 아닌 구조처럼 하나의 자료뒤에 여러개의 자료가 있을 수 있는 방식을 말합니다. 선형구조와 다르게 하나의 데이터가 여러 개의 데이터를 가리킬 수 있는 겁니다 즉, 1:n 구조라는 것이죠.

"비선형 구조"에는

데이터가 다른 여러 데이터를 가리키듯 가지가 뻗어나가는 나무모양의 구조 "트리(tree)"
이런 "트리"는 DB 프로그램 같은 곳에 쓰입니다.


한 방향이 아니라 왔다갔다가 가능한 순환 비선형 구조 "그래프(Graph)"
이 "그래프"는 말 그대로 왔다 갔다 할 수있는 순환 구조라서 보통 최단 거리를 구하는 그런 프로그램에 주로 쓰입니다. 나중에 네트워크 공부를 하실 때 배울 "라우팅" 이라는 것에 쓰이고, 우리가 길 찾기할 때 쓰는 최단거리 구하는 프로그램들도 다 이 그래프죠!


자 대충만 알아봤는데도, 이런 자료구조 지식을 통해 우리가 원하는 고급 프로그래밍을 할 수 있다는 생각이 들면서 벌써 가슴이 뜨거워지지 않습니까!!!!?

자 그럼 자료구조를 배우는, 배울 생각인 모든 분들, 재미 없다고, 어렵다고 생각하지 말고 집중해서 열심히 배우도록 합시다!


도움이 되셨다면 따뜻한 댓글 및 좋아요 팔로우 클릭 부탁합니다! 저에게 큰 힘이 되어!
더 좋은 포스트를 만들게 도와줍니다!


댓글 없음:

댓글 쓰기

#1 여러분들이 소중한 시간을 투자해 달아주시는 따뜻한 댓글들은 저에게 정말 큰 힘이 됩니다!

#2 저의 각 포스트들은 엄청난 노력과 시간 투자를 통해 만들어진 포스트들로, 무단 복제나 모방하는 것을 금지합니다.

#3 저의 포스트에도 틀린 정보가 있을 수도 있습니다. 그럴 경우 친절한 말투로 근거와 함께 댓글로 달아주시면 정말 감사하겠습니다!

* 바쁜 개인 일정으로 댓글 답변이 많이 느립니다 *