우주코딩
인터페이스 정리, Stack 클래스, Stack과 Deque 본문
인터페이스의 유용성을 다시 생각해보기
인터페이스가 없으면 개발자는 자기 마음대로 메서드를 정의한다.
ex) ArrayList - append() , delete(), update()
ex) LinkedList - add(), remove(), set()
목록을 다루기 위해 ArrayList 나 LinkedList 를 사용할 Client 는
각 클래스에 정의된 메서드를 호출해야하는 번거로움이 있다.
결론은 클래스의 사용법이 달라서 프로그래밍에 일관성이 없어 불편하다. => ArrayList를 LinkedList로 교체하기 쉽지 않다. 코드를 많이 변경해야한다.
인터페이스를 사용하면 개발자가 클래스를 정의할 때 인터페이스에서 정한 규칙에 따라 만들어야한다. 규칙을 정의한다는 것은 객체 사용법을 정의한다는 것이다.
Client 는 ArrayList 와 LinkedList의 사용법이 같기 때문에 프로그래밍에 일관성을 부여한다.
ArrayList를 LinkedList로 교체하더라도 변경해야할 코드가 적다 => 유지보수에 도움이 된다.
구현할 기능에 맞춰 적절한 구현체로 교체하기 쉽다.
Stack 클래스
push() - 스택의 맨 마지막에 값을 추가한다.
pop() - 스택의 맨 마지막에 입력된 값부터 꺼낸다.
peek() - 맨 위의 값을 꺼낸다. 단 pop()과는 달리 제거하지 않는다.
search() - 스택의 맨 위에서부터 해당 값을 찾는다. 위치는 맨 위가 1이다.
Last In First Out 방식으로 데이터를 다룬다.
값이 없는데 pop() 호출하면 EmptyStackException 예외가 발생한다.
Stack과 Deque
Dequeue 인터페이스
- "Double ended queue" 의 약자이다. 즉 앞, 뒤 모두 양방향에서 값을 넣고 꺼낼 수 있다. 그래서 큐로도 사용할 수 있고 스택으로도 사용할 수 있다.
- 즉 앞, 뒤 모두 양방향에서 값을 넣고 꺼낼 수 있다.
- 큐, 스택 둘 다 사용할 수 있도록 queue 와 stack 사용법을 모두 정의한 인터페이스다.
ArrayDeque stack = new ArrayDeque<>();
다음과 같이 스택으로서 사용할 수 있다.
push() - 스택의 맨 마지막에 값을 추가한다.
stack.push("aaa");
stack.push("bbb");
stack.push("ccc");
Stack의 Iterator와 Deque의 Iterator 차이점
Stack의 Iterator
Stack<String> stack = new Stack<>();
// push() - 스택의 맨 마지막에 값을 추가한다.
stack.push("aaa");
stack.push("bbb");
stack.push("ccc");
Iterator<String> iterator = stack.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
aaa
bbb
ccc
Deque의 Iterator
Stack 클래스와는 다르게 Deque 구현체의 Iterator는 스택 방식으로 데이터를 꺼낸다.
Iterator<String> iterator = stack.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// Iterator 설계 기법의 목적
// 데이터 조회방식( LIFO, FIFO) 에 상관없이
// 일관된 방법으로 데이터를 조회할 수 있게 도와준다.
// - 즉 스택처럼 입력 역순으로 꺼내든, 큐처럼 입력순으로 꺼내든 상관없이 개발자는 hasNext(), next() 동일한 메서드를 사용하여 데이터를 조회한다.
ccc
bbb
aaa
결론
- Iterator 를 통해 데이터를 꺼낼 때 스택의 특성을 그대로 유지하고 싶다면, Stack 클래스 대신 ArrayDeque 클래스를 사용하라.
'자바 본 강의' 카테고리의 다른 글
예외처리하기 Exception (0) | 2021.09.01 |
---|---|
List와 Set, HashSet, HashMap (0) | 2021.08.26 |
람다 문법 (0) | 2021.08.25 |
자바 API : ArrayList에 대해 (0) | 2021.08.23 |
제네릭, 제네릭 레퍼런스, 제네릭 파라미터 (0) | 2021.08.23 |