본문 바로가기
Archive

[4] Queue 함수 구현하기 - CreateQueue

by livemehere 2020. 9. 22.
 

 첫 번째로 구현할 함수는 Queue를 생성하는 함수이다.

마트에서 장을 보기위해선 당연히 장바구니를 먼저 집어야 되지 않는가?

우선 코드를 먼저 보자.

1
2
3
4
5
6
7
8
9
10
11
QUEUE* creatQueue(void) {
 
    QUEUE* queue = (QUEUE*)malloc(sizeof(QUEUE));
    if (queue) {
        queue->front = NULL;
        queue->rear = NULL;
        queue->count = 0;
    }
    return queue;
 
}
cs

 

우선 이 코드를 설명하기 이전에 우리는 메인함수에서 이 함수를 이렇게 사용할 것이다.

 

1
QUEUE* queue = createQueue();
cs

 

 매개변수도 없이 그냥 사용만 할 것이고, 반환형을 QUEUE* 로 해주기 때문에

메인함수에서는 QUEUE* queue를 선언해주고, 대입만 하면 생성단계는 끝이다.


 그럼 createQueue() 함수내부를 살펴보자.

우선 QUEUE를 포인터로 생성해준다. 포인터로 생성하는 이유는 간단하게 생각하면 변수의 지역성 때문이다.

기본적으로 함수를 통해서 구현을 하고 있기때문에, "Call by reference"를 이용한다.

즉 값을 전달하는 게아니라, 참조(주소값전달)을 하기 때문에, 포인터를 이용해야한다.


 그리곤 동적할당을 해준다.

이부분이 이해가 어려울 수 있지만, 계속 곱씹어보며 생각해보는 것을 추천한다.

포인터 = 직접값을 조정하는게 아니라 참조를 하는것

이 것을 명심하고 다시 생각해보자.

 

 우리가 지금 QUEUE라는 구조체를 포인터로 생성을 하였다. 그렇다면, 실제로 지금 구조체가 생성이 되었는가?

아니다. 그저 QUEUE구조체의 모양만 가진 껍대기를 생성한것이다.

그렇다면 이것을 사용하기 위해서 우리가 해주는 작업이 무엇인가? 바로 동적메모리할당이다.

비유를 하자면 만두를 만들기위해 만두피만 빗어 놓은 것이다. 그다음은? 고기를 넣어야 되지 않겠는가

그래야 온전히 만두로서의 역할을 하게된다.

 

 동적메모리할당으로 인해서 QUEUE라는 구조체 포인터에 직접 정보를 넣고, 사용할 수 있도록 공간이 할당된 것이다.

아? 그럼

 

QUEUE queue ;

 

이런식으로 포인터없이 생성해서 써도 되지않나요? 라는 질문을 할 수 있다.

만약 저렇게 생성하게 된다면

이후에 만들게될 함수인 enqueue나, dequeue, destroyqueue에 사용될 수 없는 구조체를 만들게 되는 것이다.

 

우리가 포인터를 쓰는 가장 중요한 이유는, 여러 함수에서 참조해서 사용하기 위해서다.


 자, 그럼 queue의 동적생성에 대해선 설명을 마쳤다.

 

 그럼이제 생성한 queue에 기초작업을 해주어야하는데, 이것을 초기화라고 한다.

생각해보자, 장바구니를 처음 딱 들었을때, 안에는 무었이 있는가? 아무것도없다.

그렇기 때문에 우리의 queue 구조체에도 아무것도 없는 상태로 만들어서 반환해야한다.

queue의 구성은

NODE* front

NODE* rear

int count

이다.

front 와 rear은 다른 NODE를 가르키는데 쓰인다고 하였다.

그러므로 처음엔 아무것도 가르키기 않기 때문에 NULL로 초기화를 해주면 된다.

count 같은 경우 아무것도 없기 때문에 당연히 0으로 초기화 해주면 된다.

그리고 return 값으로 우리가 함수내에서 생성했던 queue를 반환해준다.

 

 자 한번더 설명하자면, 여기서 queue를 반환해서 createQueue함수 밖에서도 사용할 수 있는이유는 뭐다?

포인터로 생성을 했기 때문이다.

모든 작업은 createQueue함수 안에서 이루어졌지만, 참조를 통하여 작업을 했기때문에,

main함수를 비롯한 다른 함수들에서도 그 주소만 참조를 한다면 어떠한 작업이든 접근할 수 있다.

 

다음 포스팅에선 큐에서 항목을 제거하는 dequeue에 대해서 알아보자.

반응형