쉬운코드 - 스택과 큐

Kkd·2024년 11월 20일

코딩 영상 후기

목록 보기
1/34

movie

1.스택과 큐의 개념과 사용사례

스택(stack)

동작방식

LIFO(Last In First Out) 형태로 데이터를 저장하는 구조
주요 동작: push, pop, peek

stack 동작방식

스택 메모리에서는 함수가 호출될 때마다 스택 프레임이 쌓이고 함수가 사라지면 그에 해당하는 함수의 스택 프레임도 같이 스택 메모리 영역에서 사라지는 구조로 동작을 한다.

사용사례

stack memory(스택이라는 자료구조를 사용해서 만들어진 메모리 영역) & stack frame

큐(Queue)

동작방식

FIFO(First In First Out) 형태로 데이터를 저장하는 구조
주요동작 : enqueue, dequeue, peek

queue 동작방식

사용사례

pruducer / consumer architecture


2.기술 문서에서 큐를 만났을 때 팁

항상 FIFO를 의미하지는 않음

CPU에서 ready queue라고 적혀있어 FIFO로 동작할 것으로 예상하겠지만 그렇지만은 않다.

PriorityQueue(우선순위가 높은게 먼저 빠져나가는 queue도 있다.)

문서에 queue가 나올 때 FIFO로 동작하는 queue인지, 대기열의 구조만 가진 queue인지 상황마다 다르기 때문에 잘 읽어봐야한다.


3.스택/큐 관련 에러와 해결 방법

StackOverflowError

-스택 메모리 공간을 다 썼을 때 발생
-재귀함수(recursive function)에서 (종료 조건 없이 호출되거나 종료 조건이 잘못 설정되어 호출이 계속 반복) 탈출 못해서 발생

예시코드

public class StackOverflowExample {
    public static void main(String[] args) {
        recursiveFunction(1);
    }

    public static void recursiveFunction(int count) {
        System.out.println("Count: " + count);
        // 종료 조건이 없어서 무한히 자기 자신을 호출함
        recursiveFunction(count + 1);
    }
}

수정코드(종료 조건 추가)

public class StackOverflowExample {
    public static void main(String[] args) {
        recursiveFunction(1);
    }

    public static void recursiveFunction(int count) {
        if (count > 10) { // 종료 조건
            System.out.println("Recursion ends at count: " + count);
            return;
        }
        System.out.println("Count: " + count);
        recursiveFunction(count + 1);
    }
}

OutOfMemoryError

-Java의 힙(heap)메모리를 다 썼을 때 발생
-큐에 데이터가 계속 쌓이기만 한다면 발생

해결책

큐 사이즈를 고정

만약 큐가 다 찼을 때는 어떻게 해야할까?
1. 예외(exception) 던지기
2. 특별한 값(null or false)을 반환
3. 성공할 때까지 영원히 스레드 블락(block) (공간이 생길 때까지 대기) > 스레드 낭비가 발생할 수 있다.
4. 제한된 시간만 블락되고 그래도 안되면 포기 (LinkedBlockingQueue)

profile
🌱

0개의 댓글