스택 메모리 입출력 방식 - seutaeg memoli ibchullyeog bangsig

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)이란?

📌 스택의 개념

스택 메모리 입출력 방식 - seutaeg memoli ibchullyeog bangsig

스택(stack)이란 쌓아 올린다는 것을 의미한다. 

따라서 스택 자료구조라는 것은 책을 쌓는 것처럼 차곡차곡 쌓아 올린 형태의 자료구조를 말한다.

📌 스택의 특징

스택은 위의 사진처럼 같은 구조와 크기의 자료정해진 방향으로만 쌓을수 있고,

top으로 정한 곳을 통해서만 접근할 수 있다.

top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며,

삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다.

스택에서 자료를 삭제할 때도 top을 통해서만 가능하다.

스택에서 top을 통해 삽입하는 연산'push' , top을 통한 삭제하는 연산'pop'이라고 한다.

따라서 스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다

구조적 특징을 가지게 된다.

이러한 스택의 구조를 후입선출(LIFO, Last-In-First-Out) 구조이라고 한다.

그리고 비어있는 스택에서 원소를 추출하려고 할 때 stack underflow라고 하며,

스택이 넘치는 경우 stack overflow라고 한다. (그 유명한 사이트 "stack overflow "의 이름이 여기서 유래 된 것!)

더보기

세계 여러나라의 개발자들이 프로그래밍을 하다 막혔을 때,
또는 프로그래밍에 대한 질문을 하고 답변을 받는 사이트이다.
세계 여러 나라 개발자들이 모이는 곳으로 개발자 커뮤니티 중에선 가장 규모가 크며,
웬만한 질문들은 다 올라와 있어서 구글링을 하다 보면 매우 자주 볼 수 있는 곳이다.

📌 스택의 활용 예시

스택의 특징인  후입선출(LIFO)을 활용하여 여러 분야에서 활용 가능하다.

  • 웹 브라우저 방문기록 (뒤로 가기) : 가장 나중에 열린 페이지부터 다시 보여준다.
  • 역순 문자열 만들기 : 가장 나중에 입력된 문자부터 출력한다.
  • 실행 취소 (undo) : 가장 나중에 실행된 것부터 실행을 취소한다.
  • 후위 표기법 계산
  • 수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)

큐(QUEUE)란?

📌 큐의 개념

스택 메모리 입출력 방식 - seutaeg memoli ibchullyeog bangsig

Queue 의 사전적 의미는 1. (무엇을 기다리는 사람, 자동차 등의) , 혹은 줄을 서서 기다리는 것을 의미한다.

따라서 일상생활에서 놀이동산에서 줄을 서서 기다리는 것, 은행에서 먼저 온 사람의 업무를 창구에서 처리하는 것과 같이

선입선출(FIFO,First in first out) 방식의 자료구조를 말한다. 

📌 큐의 특징

정해진 한 곳(top)을 통해서 삽입, 삭제가 이루어지는 스택과는 달리

큐는 한쪽 끝에서 삽입 작업이, 다른 쪽 끝에서 삭제 작업이 양쪽으로 이루어진다.

이때 삭제연산만 수행되는 곳을 프론트(front), 삽입연산만 이루어지는 곳을 리어(rear)로 정하여

각각의 연산작업만 수행된다. 이때, 큐의 리어에서 이루어지는 삽입연산을 인큐(enQueue)

프론트에서 이루어지는 삭제연산을 디큐(dnQueue)라고 부른다.

  • 큐의가장원소를 front / 가장 끝 원소를rear
  • 큐는들어올rear로들어오지만나올때는front부터빠지는특성
  • 접근방법은 가장 첫 원소와 끝 원소로만 가능
  • 가장 먼저 들어온 프론트 원소가 가장 먼저 삭제

즉, 큐에서 프론트 원소는 가장 먼저 큐에 들어왔던 첫 번째 원소가 되는 것이며,

리어 원소는 가장 늦게 큐에 들어온 마지막 원소가 되는 것이다.

📌 큐의 활용 예시

큐는 주로 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.

  • 우선순위가 같은 작업 예약 (프린터의 인쇄 대기열)
  • 은행 업무
  • 콜센터 고객 대기시간
  • 프로세스 관리
  • 너비 우선 탐색(BFS, Breadth-First Search) 구현
  • 캐시(Cache) 구현

📌 스택과 큐의 java 코드 및 실행결과

스택 메모리 입출력 방식 - seutaeg memoli ibchullyeog bangsig
스택 메모리 입출력 방식 - seutaeg memoli ibchullyeog bangsig
스택과 큐 코드 실행결과