Stack과 Queue
Stack : LIFO(Last In First Out)구조, 마지막에 저장된 것을 제일 먼저 꺼내게 된다
저장 : push, 호출 : pop 한 방향 박스구조, 배열에 적합하다
Queue : FIFO(First In First Out)구조, 제일 먼저 저장한 것을 먼저 꺼낸다
저장 : offer 호출 : poll 양 방향으로 뚫린 박스구조, 링크드 리스트에 적합하다
Stack의 메서드
메서드 | 설명 |
boolean empty() | Stack이 비어있는지 알려준다 |
Object peek() | Stack의 맨 위에 저장된 객체를 반환. pop()과 달리 Stack에서 객체를 꺼내지는 않는다 (비었을 때는 EmptyStackException 발생) |
Object pop() | Stack의 맨 위에 저장된 객체를 꺼낸다 |
Object push(Object item) | Stack에 객체를 저장한다 |
int search(Object o) | Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환한다 못 찾으면 -1를 반환한다(위치는 배열과 달리 0부터 시작) |
Queue의 메서드
메서드 | 설명 |
boolean add(Object o) | 지정된 객체를 Queue에 추가한다. 성공하면 true를 반환하고 저장공간이 부족하면 illegalStateException이 발생한다 |
Object remove | Queue에서 객체를 꺼내 반환한다 비어있으면 NoSuchElementException이 발생한다 |
Object element() | 삭제없이 요소를 읽어온다. peek와 달리 Queue가 비었을 때 NoSuchElementException이 발생 |
boolean offer(Object o) | Queue에 객체를 저장. 성공하면 true 실패하면 false반환 |
Object poll() | Queue에서 객체를 꺼내 반환, 비어있으면 null을 반환 |
Object peek() | 삭제없이 요소를 읽어 온다. Queue가 비어있으면 null을 반환 |
스택과 큐의 활용
스택의 활용 : 수식계산, 수식괄호검사, 워드프로세스의 undo/redo, 웹 브라우저의 앞으로/뒤로가기
큐의 활용 : 최근사용문서, 인쇄작업 대기목록, 버퍼(buffer)
-> 해당 자료구조를 어디에 써야하는지 파악하기
Queue의 구현체
PriorityQueue : 저장순서에 관계없이 우선순위(priority)가 높은것부터 꺼낸다
Deque(덱)
한쪽 끝으로만 추가/삭제할 수 있는 Queue와 달리 Deque은 양쪽 끝에 추가/삭제가 가능하다
Queue를 조상으로 가지며, ArrayDeque와 LinkedList를 구현체로 갖는다.
스택과 큐를 하나로 합쳐놓은 것과 같다
Iterator, ListIterator, Enumberation
컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다
Enumeration은 Iterator의 구 버전이고 ListIterator는 Iterator의 접근성을 향상시킨 것이다
Iterator
컬렉션에 저장된 요소를 읽어오는 방법을 표준화한 것이다.
컬렉션에 Iterator()를 호출해 Iterator를 구현한 객체를 얻어 사용한다
Iterator의 메서드
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인. 있으면 true 없으면 false |
Object next() | next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다 |
Map과 Iterator
Map은 Iterator()를 호출할 수 없기때문에 ketSet(), entrySet() values()를 호출 후 Iterator를 호출해야한다
Iterator it = map.entrySet().iterator();의 실행순서
1. map.entrySet()의 실행결과가 Set이므로
2. map.entrySet()을 통해 얻은 Set인스턴스의 iterator()를 호출해서 Iterator 인스턴스를 얻는다
3. 마지막으로 Iterator인스턴스의 참조가 it에 저장된다