Jiyong's STUDY프로그래밍/C 간단한 C언어의 메모리 구조 정리, 스택 영역 접근시 주의할 점Kingjiyong 2018. 5. 31. 04:13 C언어의 메모리 구조를 간단하게 알아보면 코드 영역 여기에는 이름 그대로 코드가 담겨있다. CPU는 필요할 때 마다 이 코드 영역에서 명령문을 가져간다. 데이터 영역 프로그램이 실행되었을 때부터 종료될 때까지 할당되어 해제되지 않는 변수가 이 데이터 영역에 상주한다. static 변수나 전역변수가 이 데이터 영역에 있다. 전역 변수는 이해가 되지만, static 변수에 대해서는 이해가 가지 않을 수 있다. static 변수는 static 지역변수라고 불리기도 하는데, 지역변수는 함수 안에서 선언되기 때문이다. 하지만, 실제로는 static 지역변수 또한 프로그램이 시작되면 할당이 된다. 힙 영역 사용자가 직접 할당하고, 해제할 수 있는 메모리는 힙 영역의 메모리이다. 이 영역엔 사용자가 변수를 할당하고, 해제 할 수 있다는 의미인데 이에 대해서는 동적 할당을 배우면서 알게 된다. 스택 영역 지역 변수와 매개 변수와 같이 함수를 빠져나가면 할당이 해제되는 즉, 소멸되는 변수들은 이 스택 영역에 존재하게 된다. 참고로 소멸된다는 의미는 그 메모리에 저장된 데이터를 0으로 초기화한다는 의미가 아니다. 소멸된 영역은 컴퓨터가 그 영역은 쓰이지 않는 영역이다. 그러니까 빈 영역이라고 판단하는 것일 뿐이다. 그에 대한 예제로 char* Example(void) { char str[20]; printf("input string : "); scanf("%s", str); return str; } int main() { char *ptr=NULL; ptr=Example(); puts(ptr); } Example 함수에서 문자열을 입력 받아 char형 배열에 저장했다. 그리고 배열의 주소값을 반환하여 main함수의 포인터 변수에 저장했다. puts 함수를 이용하여 그 결과값을 출력해보면 Example 함수에서 입력한 값이 출력 된다. 함수에서 빠져나가면 지역 변수는 소멸된다고 했지만, 실제로 접근해 본 결과는 아니었다. 하지만 이러한 코드는 문제를 가지게 되는데, 두 번 이상 Example 함수를 호출을 하면 처음 반환된 주소값은 의미를 잃게 된다. 이를 인지하고 코드를 작성해야 한다. [자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시/ 실생활 활용 스택 (STACK)이란?📌 스택의 개념 스택(stack)이란 쌓아 올린다는 것을 의미한다. 따라서 스택 자료구조라는 것은 책을 쌓는 것처럼 차곡차곡 쌓아 올린 형태의 자료구조를 말한다. 📌 스택의 특징 스택은 위의 사진처럼 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을수 있고, top으로 정한 곳을 통해서만 접근할 수 있다. top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며, 삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다. 스택에서 자료를 삭제할 때도 top을 통해서만 가능하다. 스택에서 top을 통해 삽입하는 연산을 'push' , top을 통한 삭제하는 연산을 'pop'이라고 한다. 따라서 스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다는 구조적 특징을 가지게 된다. 이러한 스택의 구조를 후입선출(LIFO, Last-In-First-Out) 구조이라고 한다. 그리고 비어있는 스택에서 원소를 추출하려고 할 때 stack underflow라고 하며, 스택이 넘치는 경우 stack overflow라고 한다. (그 유명한 사이트 "stack overflow "의 이름이 여기서 유래 된 것!) 더보기 세계 여러나라의 개발자들이 프로그래밍을 하다 막혔을 때, 📌 스택의 활용 예시 스택의 특징인 후입선출(LIFO)을 활용하여 여러 분야에서 활용 가능하다.
큐(QUEUE)란?📌 큐의 개념 Queue 의 사전적 의미는 1. (무엇을 기다리는 사람, 자동차 등의) 줄 , 혹은 줄을 서서 기다리는 것을 의미한다. 따라서 일상생활에서 놀이동산에서 줄을 서서 기다리는 것, 은행에서 먼저 온 사람의 업무를 창구에서 처리하는 것과 같이 선입선출(FIFO,First in first out) 방식의 자료구조를 말한다. 📌 큐의 특징 정해진 한 곳(top)을 통해서 삽입, 삭제가 이루어지는 스택과는 달리 큐는 한쪽 끝에서 삽입 작업이, 다른 쪽 끝에서 삭제 작업이 양쪽으로 이루어진다. 이때 삭제연산만 수행되는 곳을 프론트(front), 삽입연산만 이루어지는 곳을 리어(rear)로 정하여 각각의 연산작업만 수행된다. 이때, 큐의 리어에서 이루어지는 삽입연산을 인큐(enQueue) 프론트에서 이루어지는 삭제연산을 디큐(dnQueue)라고 부른다.
즉, 큐에서 프론트 원소는 가장 먼저 큐에 들어왔던 첫 번째 원소가 되는 것이며, 리어 원소는 가장 늦게 큐에 들어온 마지막 원소가 되는 것이다. 📌 큐의 활용 예시 큐는 주로 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.
📌 스택과 큐의 java 코드 및 실행결과 스택과 큐 코드 실행결과 |