프밍세계(??)에서는 꽤나 자주 나오는 말이다. 동적하고 정적.. 이렇게 2개...동적은 움직이는 거구 정적은 안움직이는거라고 이해하면 편하겠다 ㅎ
정적이라는 것은 한번 정하면 그것이 변하지 않는 것이다. 숫자로 표현하면 상수 같은 걸까나?
동적은 그 반대로 유연하게 자유롭게 그때그때 맞게 바뀌는 것이다.
..more
>접기
프밍 세계에선 최적화 신이라는게 계시기 때문에 언제나 동적이라는 녀석이 우대받는다. 그럼 저~~언부 동적만 쓰면 되지 않겠냐?? 그렇게 되면 프로그램이 더욱 최적화 되어 돌아가겠지만... 아쉽게도 우리의 현실은 그렇지 못하다. 동적이라는 녀석은 언제나 정적이라는 녀석보다 어렵다.
정적이라는 녀석으로 만들면 10분이면 끝나는 것을 동적으로 만들면 1시간... 뭐 과대 비교일지 모르겠지만 대충 이런 느낌이다.
결국 동적이라는 것은 좋지만 그 만큼 시간이 더 들어간다. 물론 이것이 절대 진리는 아니므로 너무 믿지는 말고....가끔은 정적으로 만드는게 더 오래걸릴지도........그런데 아직 한번도 이런 경우는 못봤다. -_-;;;
그럼 프로그램을 예로 들면서 어떤 것이 정적이고 어떤것이 동적인지 간단하게 포인터로 예를 보자.
정적) int a[10];
이것은 1차원 배열에 불과하다. 이 녀석은 int 형으로 10개의 메모리 공간을 확보했다. int는 윈32에서 4바이트를 잡으므로 결과적으로 40바이트의 메모리를 확보한 것이다.
그런데 밑에서 쓰다보니까 10개로 모자라는 경우가 생겼다. 이럴 경우에는 어떻게 대처해야 할까?
int a[11];
단순히 이렇게 고치기면 현재로써는 문제가 없을지도 모르겠다. 하지만 벌써 우린 두가지 손해를 보았다.
첫번째 손해는 컴파일을 다시 했다는 것이다. 만일 인스톨실드까지 끝나서 외부로 나갔다고 가정할때 보면 이것은 엄청난 손해가 된다. "패치" 를 돌리는 방법 밖에는 고칠 방도가 없기 때문이다.
두번째로 12가 되었을 경우이다. 10에서 11이 되었는데 12가 되지말라는 법은 없다. 언제 어떻게 프로그램 그 자신이 판단하에 메모리를 할당 하려면 동적이라는 녀석을 만드는 방법뿐이다.
그렇다면 동적으로 어떻게 메모리를 확보할까? 가장 쉽고 가장 처음 접하는 것이 포인터가 아닐까 모르겠다. 자료구조이니 뭐니 다 집어 치우고 포인터만으로도 메모리를 동적으로 할당 받을수 있다.
동적) int *a;
a=new int[10];
이것이다. 포인터를 만든 후에 new 연산자로 int형 10개의 메모리를 확보한다 이때 확보하는 메모리는 힙메모리라는 것을 알아두길 바라며, 배열과는 다르게 [] 이거 안에 변수가 들어갈수 있다.
또한 더욱 멋진 것은 delete 연산자가 존재한다는 것이다. 다들 아는 이야기를 자꾸 쑤시는 거라고 생각 할수도 있는데....모르는 사람들을 위해서 잠시 짚고 넘어가자면 new 연산자로 힙메모리를 할당 받았다면, 다 쓴후에 delete 연산자로 메모리를 꼭 해제해주어야 한다.
자 만약 10개를 쓰다가 11개가 필요하다면?? 과감히 delete 로 메모리를 파괴해주자 (이때 백업은 중요!!) 파괴한 후에 다시 new 로 메모리를 할당하면 된다. 이 시점에서 설며 아래 코드 처럼 생각하는 사람이 있는가?
int *a;
a=new int[10];
delete []a;
a=new int[12];
....
이런 생각을 가진다면 이것은 동적이라는 것과는 거리가 멀~~다. 우리는 몇가지 규칙을 알았고, 이 규칙을 가지고 프로그램 자신이 직접 계산하는 루틴을 만들어 주어야 한다.
10 이나 12 같은 이런 값들을 프로그램 자신이 계산하는 것이다.
포인터를 어느정도 쓰기 시작하면 알게 되는 것들이였지만, 한번 지껄여 본다. : )