ADT(Abstract Data Type) : 추상자료형, 개념적으로 어떤 동작이 있는지만 정의하고 구현에 대해서는 다루지 않음
DS(Data Structure) : 자료구조, ADT 정의된 동작을 실제로 구현한 것
스택 : LIFO 형태로 데이터 저장
주요 동작
1) push
2) pop
3) peek : 아이템을 빼내진 않지만 최상단 데이터가 뭔지 알 수 있음
큐 : FIFO 형태로 데이터를 저장하는 구조
주요동작
1) enqueue
2) dequeue
3) peek : 꺼내진 않지만 꺼낼 예정인 값을 알 수 있음
스택 사용 사례 : 스택 메모리 & 스택 프레임
-> 함수 호출되면 스택 프레임에 쌓이고, 함수 끝나면 사라짐
큐 사용 사례 : producer/consumer architecture
기술 문서에서 큐 : 항상 FIFO를 의미하지는 않음
-> 우선순위 큐 일수도 있음
-> 뭉뚱그려서 대기공간 느낌으로 queue로 사용할 수도 있음으로 자세히 읽어봐야 함
스택/큐 관련 에러와 해결 방법
-> StackOverflowError : 재귀함수에서 탈출 못해서 발생(탈출 조건 점검, 조건이 맞더라도 무지막지하게 깊이가 깊어지면..)
-> OutOfMemoryError : Java의 힙 메모리를 다 썼을 때 발생(큐에 데이터가 계속 쌓이가만 한다면 발생) -> 큐 사이즈를 고정하는 것이 좋음
--> 큐가 다 찬다면 어떻게 해야할까?
OutOfMemoryError 해결책
1) 예외(exception) 던지기 : 큐가 다 찼을때 데이터를 넣으려 할 때
2) 특별한 값(null or false) 반환 : 실패 했다고 알려주기
3) 성공할 때까지 영원히 스레드 블락 : 큐에 공간이 생길 때까지 대기
-> 스레드 낭비 발생 가능
4) 제한된 시간만 블락되고 그래도 안되면 포기
LinkedBlockingQueue : 위 4가지 방식을 구현한 클래스 중 하나