안녕하세요~ 마무입니다. 오늘은 제가 대학교 1학년 때 컴퓨터 공학을 공부하면서 이해가 잘 안돼 애먹었던 '정적 동적 뜻', 'static, dynamic 뜻', '동적 할당을 사용하는 이유'를 자세히 설명해보려 합니다!
읽는 분들이 컴퓨터계열 사람이며, 어느정도 C언어 이해도(동적 할당 함수 'malloc'과 포인터 개념)가 있다고 가정하고 글을 썼습니다.
/*****사전에 알고 있음 좋은 지식*****/
/***************************************/
-----목차-----
1. 컴퓨터 정적(static), 동적(dynamic)이란
2. 프로그래밍에서 정적, 동적이란
i) 동적(dynamic)할당을 사용하는 이유
3. 네트워크에서 정적, 동적이란
i) 와이파이와 DHCP 동적 할당
ii) 라우팅 프로토콜으로 설명
4. 정리
---------------
더 많은 컴퓨터의 지식들은
리눅스 독학 페이지: https://mamu2830.blogspot.com/p/blog-page_13.html
운영체제 독학 페이지: https://mamu2830.blogspot.com/p/blog-page_14.html
프로그래밍 독학 페이지: https://mamu2830.blogspot.com/p/blog-page_33.html
에서 찾아보세요!
1. 컴퓨터 정적 동적 뜻
저는 대학교 1학년 때 서적에서 나오는 이 '동적'이란 말이 도저히 이해가 안 돼 애를 먹었었습니다. '정적'은 고정 혹은 멈춰있다는 '정'이니 나름 이해가 됐지만, 정반대 의미인 움직인 다는 뜻인 '동적'은 도저히 이해가 되지 않았죠.
'뭐지? 코드가 움직인다는 건가? 고정돼 있지 않다는 것인가? 고정돼 있지 않다는게 도대체 뭘까? 왜 사용하는거지?' 라면서 말이죠.
거기에 정적(static), 동적(dynamic)이렇게 옆에 영어로 써 있는 static, dynamic은 당시 제가 아는 뜻이라곤 'static(정전기)'와 'dynamic(역동적인)'뿐이여서 더 이해가 안 됐습니다.
하지만 훗날 영어를 더 깊게 공부하고, 많은 컴퓨터공학의 동적 할당 기술을 사용하다보니 이 동적(dynamic)란 것이 뭔지 알게 됐습니다.
말이 길어졌는데 우선 컴퓨터공학에서 사용하는 진정한 static과 dynamic의 영단어 뜻부터 알고 갑시다.
static : 움직이거나 변하지 않는
dynamic : 끊임 없이 변하거나 발달하는
그렇습니다. 말 그대로 정적(static)이란 한번 정해놓으면 변하지 않고 계속 유지되는 성질을 말하며, 동적(dynamic)이란 상황에 따라서 실시간으로 변하는 성질을 말하는 것이었습니다.
그래서 컴퓨터공학에서 만약 처음 정해놓은 것이 그대로 계속 유지되기 원한다면 '정적'으로 하고, 만약 상황에 따라 그때 그때마다 달라지는 설정을 하고 싶으면 '동적'으로 하는 것이죠.
....
사실.. 이렇게 말로만 들으면 이해가 안 되실거 잘 압니다...
그래서 한번 이 정적, 동적이라는 용어가 컴퓨터공학 분야마다 각각 어떻게 쓰이는지 예시를 들어, 이해가 되도록 해보겠습니다!
2. 프로그래밍에서 정적 동적 뜻
위에서 설명했던 것대로, 정적(static)이란 한번 정해놓으면 변하지 않고 계속 유지되는 성질을 말합니다. 뭔가 거창한 것 같지만, 사실 프로그래밍 때 저희는 이 알게모르게 '정적(static)'요소를 많이 사용했습니다.
'C언어'에선 #define 이나, 변수 앞에 const(변하지 않는)를 붙이는 것처럼 말이죠.
'자바'에선 자주 사용하는 static 키워드가 있죠.
그리고 이런 정적으로 만드는 키워드 외에도, C언어같은 엄격한 규칙 언어 같은 경우 배열 같은 경우 크기를 한번 정해놓으면, 딱 그 공간(주소)만 사용할 수 있지 않습니까?
이렇듯 미리 정해놓은 공간만 고정적으로 사용할 수 있는 배열도 '정적'요소라고 할 수 있죠.
i) 동적 할당을 사용하는 이유
사실 'const'나 '배열'외에도 엄격한 규칙의 언어(C, C++)로 작성한 대부분의 코드(프로그램)는 정적(static)요소라고 볼 수 있습니다.
무슨 소리냐? 저희가 '동적 할당'이란 특별한 방법 없이 짠 코드는 실행전에 컴파일이 코드에 적혀있는 변수나 정의된 크기에 맞춰서 메모리를 딱 정해 할당하기에 메모리 변경이 없는 정적 요소라는 것이죠.
그래서 실행중인 프로그램엔 이미 필요한 메모리만큼만 계산돼 메모리가 할당되기에, 코드에 정의된 것 이외의 범위나 더 많은 데이터를 못 가져옵니다(변경이 안됩니다).
예를 들어보겠습니다.
C언어 코드에서, 문자열을 읽어들여 저장하는 버퍼의 크기를 2*1KB(char buffer[1024])사이즈로 해놓았다고 해봅시다.
파일에 저장된 문자열을 메모리 내 버퍼로 불러오는데 파일의 크기가 예를 들어 3KB(3072byte)정도로 정의해둔 2KB 버퍼를 초과하면, 초과한 만큼의 데이터는 불러오지 못할겁니다.
그렇다고 데이터 누락을 피하기 위해 버퍼크기를 더 크게 200KB(char buffer[102400])이렇게 만들어 놨다 해도, 실제로 사용하는 파일의 크기가 1KB정도로 적을시, 나머지 199KB의 메모리는 낭비가 되는 것이고, 반대로 파일의 크기가 200KB를 넘을 정도로 크면 또 누락이 되는 것이죠.
당연히 이런 경우, 파일의 크기에 맞춰서 배열(버퍼)의 크기를 조절하면 되는 거 아니냐!! 할 수 있겠지만, 엄격한 법칙의 'C언어'인 경우, 배열의 크기를 정의할 때 변수를 사용할 수가 없습니다.(상수만 가능)
그래서 프로그램이 작동될 때 필요한 메모리양이 얼마나 될지(버퍼 크기를 어떻게 할지)를 미리 정해야했고, 프로그래머는 계산하느라 골머리를 앓아야하죠(프로그래머도 사람이야 사람!)
당연하게도 이러한 상황을 위해 있는 C언어 코드가 있으니... 바로 프로그램 실행중 필요에 따라 메모리를 할당 및 변경할 수 있는 '동적 할당' 기술이였던 겁니다.
그럼 C언어 프로그래밍에서의 '동적(dynamic)'기술엔 무엇이 있을까요?
대표적으로 'C언어'에선 malloc(memory allocation, 메모리 할당)이란 함수를 통해 동적 할당을 받습니다.
이 'malloc'이란 함수로 메모리를 동적 할당을 하면 변수를 이용해서, 정확하게 그때 그때마다 필요한 크기를 계산해 버퍼를 만들 수 있으며, 실행중 메모리크기 변경이 필요할 때는 'realloc(reallocation)'함수를 통해 변경을 할 수 있습니다.
말로만 하면 또 와닿지 않기에 똑같이 버퍼로 설명해보겠습니다.
char *buffer = (char*)malloc(변수 + 1{1은 NULL을 위한 것}) 이렇게 동적 할당 코드를 작성해놓으면, 이후 fseek()과 ftell()와 같은 함수들과 변수를 이용해, 그때 그때 파일 크기에 맞춰 버퍼의 크기를 만들 수 있다는 것이죠.
다시말해서 만약 파일의 크기가 138Byte였으면, 딱 138Byte만큼 알뜰하게 버퍼크기를 만들어 데이터를 읽어 올 수 있다는 것이죠.
그러다가 만약 더 많은 데이터를 저장할 버퍼가 필요하면, 'realloc'으로 필요한 메모리 사이즈를 변경하면 되고요!
그리고 이 때 당연히 기존 malloc()으로 저장했던 138Byte의 데이터는, realloc()함수로 버퍼 사이즈를 변경해도 자동으로 보존이 됩니다.
또 다른 대부분의 프로그래밍 언어(java, python 등등)에서는 실행중 변경이 가능한 코드들은 모두 '힙(heap)'이란 메모리 공간에 저장이 되며, 이러한 힙(heap)에 저장되는 코드들은 모두 동적요소라 볼 수 있는 겁니다.
또한 배열을 사용하지 않는 '자료구조들'은 포인터와 동적 할당을 이용해 만들어집니다.
이런식으로 프로그래밍을 할 때, 프로그램 실행중 변경이 필요한 곳에 모두 동적 할당 기술이 사용이 된다는 것이였습니다.
당연히 프로그래밍 뿐만 아니라, 다른 컴퓨터 분야에서도 정적, 동적 개념이 모두 비슷하게 사용됩니다만 좀 더 깊은 이해를 위해 네트워크에서 사용되는 정적, 동적 개념도 설명해보겠습니다.
3. 네트워크에서 정적, 동적이란
저의 '네트워크 독학 페이지 -> 인터넷이란' 포스트를 보고 오셨으면, 사실은 인터넷이란 라우터들의 집합체이며, 네트워크 엔지니어가 바로 그 라우터 설정을 하고, 네트워크 망을 관리하는 일을 한다는 것을 아실겁니다.
하지만 포스트를 안 보고 오신분들이 있을 수 있기에, 현재 살고있는 사람이라면 대부분 아는 '와이파이'로 설명을 해보겠습니다.
i) 와이파이와 DHCP에서의 동적 할당
다들 인터넷을 사용하려면 'IP주소'라는 것이 필요하다는 건 아실겁니다.
그래서 당연히 공유기를 통해 만들어진 와이파이를 사용할 때도 IP주소가 필요합니다.
그리고 이 경우 공유기에서 만든 가상의 IP를 할당받으며, 이 때의 가상의 IP는 공유기에서 공인 IP로 바뀌어서 인터넷에서 사용되는데요
문제는 와이파이에 접속하는 사람들에게 공유기가 가상의 IP를 줄 때 도대체 어떻게 줬을까라는 겁니다.
저희는 와이파이에 비번만 입력하면 자동으로 와이파이에 연결이 되니까 말이죠...
사실 이 과정은 저희가 와이파이에 비번을 입력하면, 공유기에서 DHCP(Dynamic Host Configuration Protocol)라는 기술을 이용해 실시간으로 남는 IP를 접속한 사람들(정확히는 기기)에게 할당했기에 가능했던 것이였습니다.
눈치 빠르신분들은 벌써 보셨을겁니다! 바로 'DHCP'에서 'D'가 말이죠!!!
그렇습니다. 위에서 계~~속 설명해오던! 바로 그 Dynamic(동적)입니다.
Dynamic(동적, 실시간 상황에 따라 변하는)이란 용어에 맞게, 이 'DHCP'는 실시간으로 IP 사용중이던 사람이 빠지면 IP를 회수하고, 새로운 사람이 들어오면 여분의 IP를 할당하는 기술(프로토콜)입니다.
그럼 공유기에선 항상 동적할당(DHCP)를 사용하는가? 그건 또 아닙니다. 하지만 'DHCP'를 사용하지 않을 경우, 누군가(보통 네트워크관리자)가 일일이 남는 IP를 할당했다가, 다시 회수했다가 해야할 것입니다.
보통 이런 경우는 보안을 위해서 IP를 정적(static)할당을 사용하는 것이며, 위에서 말했듯 보통 네트워크 관리자에게 부탁해야합니다.
하지만 대부분의 상황에서는 DHCP를 사용합니다. 왜냐면 와이파이에 일일이 IP를 고정 할당하는게 상당히 귀찮기 때문입니다... 상상해봅시다, 카페에 가니 사람들이 알바에게 "IP 할당해주세요"라고 하며 줄 서 있는 그런 끔찍한 상황을 말이죠...
당연히 IP 할당만 하는게 아니라... 또 오랜시간 카페를 이용하지 않은 손님의 IP할당은 회수해야하고.. 그런거 하나하나 생각하자면 정말 쉬운 일이 아니죠..
그렇기에 보통 공유기 와이파이는 DHCP라는 동적(Dynamic) 기술을 주로 사용하는 것이며, 우리 삶에서 사용되는 와이파이는 대부분 동적기술이라는 것이죠!
ii) 라우팅 프로토콜으로 설명
좀 더 네트워크 깊숙한 지식을 예시로 들어보자면(여기서 부터 이해가 되시려면 네트워크독학 -> 인터넷이란 포스트를 보고 오셔야합니다)..
사실 저희들이 사용하는 인터넷은 전 세계 통신사(KT, LG, SKT등등)에서 구축한 라우터들이 서로 연결돼 가능했던 것이였는데요, 바로 여기서 의문이 듭니다.
어떻게 통신사에서 인터넷을 사용하는 수 많은 사람들에게 남는 IP를 할당하거나 사용하지 않는 사람의 IP를 회수할까? 라는 의문이 말이죠.(KT통신사만 해도, KT 인터넷을 쓰는 기기는 얼마나 많을까 상상이 안되죠..)
또 특정 라우터와의 연결이 끊겼을 때, 연결이 끊겼다는 것과 또다른 라우터로 가는 길이 있다는 것을 어떻게 알까요?
작은 소규모 네트워크가 아닌, 전세계의 네트워크가 연결된 '인터넷'에서 이런것을 인간이 일일이 설정(정적으로)하는 것은 불가능이라고 볼 수 있습니다.
그래서 당연히 '라우터'에서 네트워크 엔지니어가 사용하는 동적 기술, 즉 실시간으로 네트워크 상태를 알려주고 반영하는 프로토콜이 있으니...
바로 컴퓨터쪽 종사자면 한번쯤 들어봤을 유명한 EIGRP, OSPF, BGP와 같은 '라우팅 프로토콜'입니다.
이렇듯 인터넷을 만들 때 사용되는 라우팅 프로토콜은 다 동적(Dynamic)기술였다는 것이고 다시 말해 일상에서 없으면 안되는 '인터넷'도 결국 동적 기술로 만들어졌다는 것이죠!
4. 정리
I) 컴퓨터 분야에서 사용되는 '정적(static)'이란 한번 정해놓으면 변경이 안되는 것이다.
II) 컴퓨터 분야에서 사용되는 '동적(dynamic)'이란 실시간으로 상황에 따라 변경이 가능한 것이다.
III) 프로그래밍에서 엄격한 규칙 언어인 'C, C++'인 경우 프로그래밍 실행중에 메모리 변경이 안되며, 실행중 변경하기 위해 사용하는 기술이 동적 할당(malloc)이다. 그리고 동적 할당이 아닌 코드들은 대부분 정적요소라고 볼 수 있다.
IV) 유연한 언어인 '자바나 Python'같은 경우 힙(heap)메모리에 올라가는 코드들은 동적 요소라고 볼 수 있다.
V) 우리가 일상 생활 사용하는 와이파이에서 쓰는 'DHCP'라는 프로토콜도 동적 요소며, 인터넷을 구성할 때 라우터에서 사용하는 라우팅 프로토콜(ospf, eigrp, bgp 등등)들도 동적 요소다.
이번엔 제가 대학교 1학년 때 알았으면 좋았을 것 같은 지식인 '정적'과 '동적'이란 기술과 용어를 프로그래밍과 네트워크를 예시로 설명해봤습니다!
꼭 누군가에게 도움이 되길 바라며!! 도움이 되셨다면 따뜻한 댓글 달기 및 팔로우를 해주시면 저에게 큰 힘이 돼 포스트 퀄리티 향상에 도움이 됩니다!
그럼 다음에 더 좋은 퀄리티 포스트로 찾아뵙겠습니다!
잘 읽고 갑니다..! 도움이 많이 됬어요 ㅎㅎ
답글삭제도움이 돼 정말 다행입니다..! 따뜻한 댓글 감사해요 ㅎㅎ
삭제