Video Thumbnail 14:17
BJ.11 스택과 큐 설명! 참 쉽죠~~? 기술 문서 읽다가 큐 만났을 때 팁과 스택/큐와 관련된 에러들 그리고 해결책도 설명드려요!!
19.0K
319
2022-01-23
#스택 #큐 #자료구조 #ADT #stack #queue #datastructure 오늘은 스택과 큐에 대한 설명입니다! 지금까지 업로드된 백발백중 영상에서 종종 등장했었는데 오늘 집중적으로 어떤 개념인지 다뤄봅니다! 그리고 기술 문서를 읽다가 큐 용어를 만났을 때의 팁과 자바에서 스택/큐와 관련된 에러와 그 해결책도 설명드려요~!
자막

네 반갑습니다 오늘이 영상을 끝까지 보신 후엔 스택과 큐의 개념 그리고

사용 사례와 기술 문서에서라는 용어를 만났을 때의 팁 그리고 끝으로 스택과

와 관련된 에러들 그 해결 방법을 알게 됩니다 자 그럼 오늘도

렛네 우선이 앱스트랙트 데이터 타입과 데이터 스트럭처의 차이가 무엇인지부터

먼저 설명을 해야 될 것 같아요라고 는이 스트트 데이터 타입은 추상

자료형을 뜻합니다 이게 무슨 의미냐면 개념적으로 어떤 동작이 있는지만

정의를 내리고 실제로 어떻게 구현하는 것인지에 대해서는 다루지를 않는게

바로이 앱스트랙트 데이터 타입입니다 그럼 DS 데이터 스트럭쳐는 뭐냐

우리말로는 자료 구조라고 하는데요에서 정의된 동작을 실제로

구현한 것이라고 보시면 됩니다 자 그럼 오늘이 영상은 스택과 ql

ADT 관점에서만 다뤄요 무슨 말이냐면 스택과 qy 구현을 따로

설명하지는 않습니다 개념적으로 설명을 할 거예요 자 그럼 스택과 큐의 개념

설명을 먼저 하도록 하겠습니다 스택은 라스트인 퍼스트 아웃 형태로 데이터를

저장하는 구조를 말합니다이 스택에는 주요 동작이 있는데요 먼저 스택에

어떤 아이템을 집어넣는 푸시가 있고요 그 스택에서 아이템을 빼내는 팝이

있습니다 그리고 그 스택에서 아이템을 빼내지 않지만 가장 최상단에 있는

아이템이 뭔지를 알 수 있는 픽이라는 동작이 있어요 그럼 예를 들어서

스택이 어떻게 동작하는지를 살펴볼게요 스택을 이렇게 하나 그렸습니다 얘가

이제 스이고 요게 만약에 제가 푸시 1을

하게 됐어요 그러면이 스택 안에 이제 1이

들어갑니다 그리고 또이어서 푸시 2를 했어요 그럼이 안에 또 2가 쌓입니다

그리고 또 푸시 3을 했어요 그럼이 안에 3이 쌓여요 여기까지 하고

만약에 이제 제가 팝을 했습니다 팝을 하면 지금 가장 최상단에 있는이 3이

3을 뽑아냅니다 그러면서 스택에서는 사라집니다 그리고이어서 제가 픽을

했어요 픽을 하게 되면 지금 가장 최상대 있는게이 이익기 때문에이

2라는 값을 가져옵니다 하지만 스택에서 사라지지는 않죠 그리고 다시

을했어 그럼 이번에는 상단이이 2이기 때문에이 2를 뽑아내고 이번에는이

2라는 값이 스택에서 사라집니다 그리고 이때 다시 푸시

4를 했어요 그러면은이 스택에 다시 4가 쌓이는 거죠 이런 식으로 가장

마지막에 들어온 애가 가장 먼저 나가고 가장 먼저 들어온 애가 가장

마지막에 나가는 그런 구조라고 보시면 되겠습니다 그럼 이번에는에 대해서

알아보겠습니다는 스인 아웃 형태로 데이터를 하는 구조예요 이에도 주요

동작이 있는데요 이에 아이템을 집어넣는 큐가 있고요 그리고에서

아이템을 꺼내는 dq 있습니다 그리고 꺼내진 않지만 이제 꼭 꺼내게 될 그

아이템의 값을 알 수 있는 픽이라는 동작이 있습니다 그래서 Q 어떻게

동작하는지를 살펴보면 먼저 이렇게를 그리겠습니다를 그리고요 Q 다가

만약에인 Q 1을 하게 됐습니다 그러면 얘가 이제 1이라는 값이 Q

들어가고요 또가 Q 2라는 걸 했어요 그러면 얘가 이제 2가 들어가게

되고요 또 Q 다가인 Q 3을 했습니다 그러면 또 3이 들어가겠죠

그리고 이제 dq 했습니다 dq 하게 되면 지금 가장 먼저 들어온 애가

지금 1이었고 dq 호출하면 1이 나오고요 그러면서 Q에서는이 1은

사라지겠죠이어서 또 dql 하게 되면 이번에는이 2가 나가게 될 거죠

그리고 Q이 2는 사라질 겁니다 그리고 이번에는 픽을 해 봤어요 그럼

이때는 값은 빼진 않지만 다음 차례가 이제 3이 아아 그래서이 3을 출력을

하게 됩니다 하지만 여전히 Q는 남아 있죠 그리고이 상태에서 다시인 Q

5를 했습니다 그러면 이번에는 이제 5가

들어갈 거고요 다시 dqr 호출을 하면 이번에는이 3이 빠져나갈 차례죠

그러면은 3이 빠져나오면서 Q 그래도 사라지게 됩니다 이런 식으로 먼저

들어간 것이 먼저 나오는 방식이 Q 방식이에요

자 그러면 스택과 큐의 사용 사례를 한번 살펴볼게요 먼저 스택 사용

사례는 우리가 앞전에 배웠던이 스택 메모리이 스택 메모리가 실제로이

스택이라는 자료 구조를 사용해서 만들어진 메모리 영역이에요이 스택

메모리에서는 함수가 호출될 때마다 스택 프레임이 쌓이고 함수가 사라지면

그에 해당하는 함수의 스택 프레임도 같이이 스택 메모리 영역에서 사라지는

그런 구조로 동작을 하죠 이거는 우리가 앞전 영상에서 배웠기 때문에

우측 상단에 관련해서 링크를 걸어둘 테니깐요 혹시 자세히 보고 싶으신

분들은 그 영상을 좀 참조하시면 될 거 같고요 여기서는 간단하게 한번

살펴보겠습니다 어떤 스택 메모리가 이렇게 있어요 이거는 이제 스택

메모리를 나타냅니다 그리고 이제 함수가 이렇게 정의되어 있다고 해

봅시다 8성 코드로 짜볼게요 먼저 a 아는 이름의 함수가 있습니다 얘는

내부적으로 B 호출해 근데 또 B 아는 함수가 있어요 얘는 내부적으로

C 호출해 그리고 또 C 아는 함수가 있어요 얘는 내부적으로 프린트를 하고

끝이납니다 와우 와우를 프린트해요 자 그러면

이제이 함수를 차례차례 한번 호출을 해 봅시다 이제 여기서 a 아는

함수를 호출하는 순간이 스택 메모리에는 a 관련된 스택 프레임이

하나 쌓입니다이 A 이제 호출한 거예요 근데 a 내부적으로 또 B

호출하지 그러면은 이제이 B 호출을 하게 되는 순간이 스택 메모리에는 또

함수 B 대한 스택 프레임이 쌓입니다 그리고 B 내부적으로 보니까 또 C

함수 C 호출하자 아요요 그러면 또 함수 C 호출하는 순간 또 스택

메모리에는 함수 C 대한 스택 프레임이 쌓입니다 그럼이 함수 c n

와우를 출력한 뒤에 함수 C 호출은 종류 돼요 그럼 함수 시의 호출이

종료되는 순간이 함수 C 대한 스택 프레임은이 스택 메모리에서 사라집니다

이제 호출이 끝이 나면서 거꾸로 올라오는 거죠 그리고 마찬가지로 이제

함수 C 호출이 끝이 났으니까 함수 B 호출도 끝이 나겠죠 그럼 함수 B

호출이 끝이 나면서 스택 메모리에서는 마찬가지로 함수 B 대한 스택

프레임이 사라집니다 그럼 함수 B 호출이 끝이 나면서 다시 함수 a

돌아왔고 함수 a ES 최종적으로 이제 호출이 끝이 나면이 스택

메모리에 있는 함수 a 대한 스택 프레임도 사라지게 됩니다 이런 식으로

스택 메모리라는 메모리 영역에서 스택이라는 자료 구조가 사용이 된다

이거를 이제 보셨고 이번에는 Q 사용 사례를 살펴보겠습니다 이거는 앞전에

모니터와 관련된 영상에서 봤던 건데요 프로듀서 컨슈머 아키텍처에 이큐가

사용될 수 있습니다 어떤 형태면 이렇게 하나를 만들어요

이게입니다 그리고 여기에는 프로듀서가 하나 있습니다 물론 여러 개가 있을

수도 있어요 그리고 여기에는 컨슈머가 있어요 마찬가지로 컨슈머 여러 개가

있을 수 있습니다 그러면 프로듀서는 계속해서 아이템을 생산을 해요 그럼이

프로듀서가 생산하는 아이템들이에 차곡차곡 쌓이겠죠 그럼 그때마다 또

컨은에 들어 있는 아이템을 차례대로 컨을 합니다 그리고 그 아이템과

관련된 여러가지 처리를 하는 거죠 이게 실제로 백엔드는 전형적으로 많이

사용되는 처 중에 하나입니다 자 그러면 기술 문서에서를 만났을 때

팁을 조금 드리도록 하겠습니다이 기술 문서에서라는 용어를 만나면 이게 항상

퍼스트인 퍼스트 아웃을 의미하지는 않아요 이게 어떤 경우에 그러냐면

예를 들면 우리가 지금 초반에 OS 운영 체제에 대해서 공부를 했잖아요

그러면 우리가 멀티테스킹이 것을 공부를 했어요 멀티테스킹이 뭐냐면 자

여기 CPU 하나가 있고요 CPU 실행되어야 될 프로세스가 세 개가

있다고 해 볼게요 프로세스 1 로 2 프로세스 3가 있습니다 그러면이

CPU 여기서 싱글 코라고 예를 든다면이 세 개가 동시에 실행될 수

없고 반드시 CPU 한 번에 하나만 실행이 되잖아요 그럼 멀티테스킹

방식은 P1 조금 실행됐다 P2 조금 실행됐다 p3 조금 실행됐다 뭐 이런

식으로 번갈아가면서 실행된다고 했었는데 그러면은 예를 들어서 지금

P1 실행되고 있는 동안에 나머지 P2 p3 레디큐는 곳에 대기를

합니다 근데 여기서 문서를 보면은 이게 레드라고 되어 있어 가지고니까

아 그러면은 퍼스트인 퍼스트 하우스라 동작을 하겠다라고 생각하실 수 있는데

근데 꼭 그렇지만 않는게 이게 좀 애매한데이라는 것이 사실은 퍼스트인

퍼스트 아웃이라는도 있지만 이제 다음 영상에서 다룰 건데 프라이어리티라고

해 가지고 먼저 들어온 것이 먼저 빠져나가는 것이 아니라 우선 순위가

높은게 먼저 빠져나가는 Q 있어요 이런 식으로라는 용어 자체가 반드시

스인 first 아웃을 의미하는 것이 아니라 그냥 뭉뚱 그려서 뭐가

들어왔고 그리고 뭐가 나간다 그래서 뭔가를 저장하고 있는 어떤 대기열

같은 느낌 대기 공간 같은 느낌으로 큐를 사용할 때가 있습니다 그래서

문서를 딱 읽으실 때 잘 읽어 보셔야 돼요요 큐가 정말 퍼스트인 퍼스트

아웃스 의미하는 건지 아니면은 그냥 뭉뚱 그려서 어떤 큐라고 한 건지

그때마다 조금씩 다르기 때문에요 자 그럼 마지막으로 스택 그리고 큐와

관련해서 흔히 보는 에러와 그 해결 방법을 설명을 드리겠습니다 이거는

실제 개발하다가 만나는 에러들이 때문에 자바를 기준으로 설명을

드리겠습니다이 스택 오버플로우 에라는게 있는데요 이게 뭐냐면 이름만

보셔도 아시겠죠 스택 메모리 공간을 다 썼을 때 발생하는 에러에이 에러는

보통 거의 대부분이 재귀함수 영어로는 리커시브 펑션이 하는데요 여기서

탈출을 못해서 함수 호출을 계속 하다 보니까 발생을 하는 겁니다 요게

지금이 재귀 함수의 전형적인 예인데요 피보나치 수열에서 n 번째 항목이

어떤 값을 가지는지를 계산하는 함수입니다 근데 피보나치 수열이 뭔지

지금은 뭐 궁금하지 않으셔도 되고요 핵심은이 내부적으로 보면이 함수를요

안에서도 호출을 하고 있죠 그래서 이렇게 자기 자신을 함수 내부에서

호출하는 거를 리커시브 펑션 재귀 함수라고 하고요 근데 여기서 중요한

부분이 뭐냐면이 탈출 조건입니다이 탈출 조건이 있어야 자기를 계속

호출하고 호출하고 호출하다도 어느 순간에는 빠져나갈 수 있거든요 근데

개발을 하다가 보통이 탈출 조건을 적어 주기를 까먹었거나 아니면 잘못

적어 줘서 함수 호출은 시작했는데 그 끝이 안 나는 바람에 스택 메모리를

다 썼을 때 이때 스택 오버플로우 에러가 발생을 하게 되는 겁니다

그래서이 경우는 해결 방법이 간단한게이 탈출 조건이 탈출 조건을

잘 써 주면 됩니다 물론 탈출 조건을 잘 써줬다 하더라도 무지막지하게이

데스가 깊어지게 호출하는 거라면 그것도 문제가 되겠죠 이번에는

아웃오브 메모리 에러를 살펴보겠습니다이 아웃오브 메모리

에러는이 자바에서 힘 메모리를 다 썼을 때 발생해 이 힙 메모리라는

것은 객체가 거주하는 메모리 영역이라고 했잖아요이 영역을 다 썼을

때이 아웃오브 메모리 에러가 발생을 하는데 물론이 흰 메모리를 다

고갈시켜 버리는 여러 가지 이유가 있습니다 그런데 그 중에 하나가 뭐가

될 수 있냐면 내부적으로 큐를 사용을 했는데 데이터가 계속 쌓이기만 해서

메모리를 다 잡아 먹어 버린 거예요 그러니까 큐에서 데이터를 누가 컨슘

해서 처리를 해 줘야 되는데 뭐 컨슘 속도가 느린 걸 수도 있고 이유

자체는 다양할 겁니다 그래서이를 해결하기 위해서는 q의 사이즈를

고정하는게 중요합니다 이큐를 무작정 막 거의 언리미티드 무제한적으로

사용할 수 있도록 하면 안 되고 메모리가 고갈되면 안 되니까 q의

사이즈를 고정하는게 중요해요 그러면 어떤 이슈가 발생할 수 있냐면

만약에가 다 쳤을 때는 어떻게 해야 될까이 이슈가 발생을 합니다요 문제는

총네 가지 형태로 해결할 수 있는데요 먼저 q가 다쳤을 때 또 아이템을

집어넣으려고 한다면 이때는 예외를 던져 버리는 거예요 익셉션을 던져

버리고 문제가 있다고 알려 주는 겁니다 또 다른 방법은 특별한 값

여기서는 널이 포스라는 값 값을 반환하도록 해서 네가 한 일은

실패했어 이렇게 알려주는 그런 또 다른 방식이 하나가 있고요 또 세

번째 방법은이 밀어 넣으려고 했던 쓰레드는에 공간이 생길 때까지 영원히

블락이 되는 거죠 여기서 블락이 된다는 거는 공간 생길 때까지

대기한다 의미겠죠 이런 방식이 하나 있고 대신에 이거는 쓰레드가 이제

블락이 돼 버렸기 때문에 그 이후에 작업을 아무것도 못 하게 되니까

쓰레드 낭비가 발생할 수 있을 거고요 마지막 방법은 제한된 시간만 블락하고

제한된 시간이 지났는데도 불구하고가 다 아이템을 넣을 수 없다면 그러면

그때는 그냥 포기를 하는 겁니다 에이 안 넣어 안 넣고 말지 뭐 이런

개념인 거죠 이렇게 총네 가지 정도의 방식이 있는데요 실제로 자바에서

이런네 가지 방식을 구현한 몇몇 클래스들이 있는데 그 중에 하나가이

링크드 블록킹 Q 있니다 지금 보시는 것은이 링크드 블록킹 큐에 대한

API 문서에서 일부를 가져온 건데요이 인트 부분을 보시면 만약에

아이템을 넣으려고 했는데 큐가 다 찼다면 익셉션을 날리게 하려면이

애라는 메서드를 사용하라는 얘기고요 스페셜한 값을 가지고 오게 만들 려면

이때는 오라는 이름의 메서드를 호출하는 거고 빈 공간이 생길 때까지

그 쓰레드를 블락을 시키려면 푸쉬라는 메서드를 사용하라는 얘기고요 일정

시간 동안은 블락 했지만 그 일정 시간이 지나도 큐에 빈 공간이 생기지

않아서 그때는 그냥 포기하게 만들 거라면 그때는 오라는 이름의 메서드에

타임아웃을 파라미터로 전달하라는 그런 설명입니다 그래서 이큐의 아이템을

밀어넣을 때 만약에가 다쳤다면 어떻게 동작했다 에 따라서 사용할 메서드들을

이렇게네 가지로 다 구분 해 놨습니다 그리고 거기에 커플처럼 또 아이템을

뺄 때에는 어떤 메서드를 호출해야 되는지가 그 밑에 있고요 궁금하신

분들은 한번 읽어 보세요 자 오늘은 이렇게 스택과 큐에 대해서

살펴봤습니다 지금까지 운영 체제와 관련돼서 이런저런 얘기를 많이 하다가

아무래도 내용도 조금 어려울 수도 있고 할 것 같아서 중간에 약간

쉬어가는 느낌으로 또 그 사이에 뭐 스택과 큐에 대한 얘기들이 나왔었으나

오늘은 스텝과 큐에 대한 설명을 드렸습니다 자 다음 영상에서는 오늘

얘기에 나왔던이 프라이어리티 큐가 무엇인지 설명드리도록 하겠습니다

오늘도 끝까지 봐주신 모든 분들 최고이고요 이후 영상도 늘 그랬던

것처럼 많이 기대해 주시면 감사하겠습니다 오늘은 목 상태가

좋아서 좀 힘차게 설명할 수 있었던 거 같아요 그럼 다음 영상으로

뵙겠습니다 감사합니다