Java 21 기준 java.util에 구현된 Stack과 Queue를 살펴봤다.
사실 Stack이라는 자료구조를 사용한 적이 별로 없다. ArrayList로 대체 가능했기 때문이다.
대신 Queue는 자주 사용해봐서 Queue가 Interface여서 LinkedList로 선언해주는 것은 알고 있었다.
그래서, Stack 또한 Interface로 생각했지만 사실은 다르다.
밑에 내 생각을 써놨다.
Stack을 뜯어보니 애초에 Interface가 아니라 class이다.
그럼 ArrayList를 상속받았겠지? 라고 생각했지만 또 아니였다.
Stack은 Vector 를 받는다. 여태 Java를 사용하면서 ArrayList 대신 Vector를 사용해본 적이 없어서 찾아봤더니.. 예전에 쓰던 클래스이고, ArrayList와는 다르게 Thread safe라고 한다. 그 부분은 자세히 조사를 안해서 필요하면 찾아봐야겠다.
특별한 경우가 아니면 Vector 대신 ArrayList를 권장한다고 봤다.
아무렇지 않게 Queue를 선언할 때 LinkedList 객체를 넣어줬다.
왜 그래야할까? Interface Queue를 살펴봤더니 Collection를 상속 받는다.
그렇다면 임의로 Interface MyQueue를 만들고 똑같이 Collection을 상속받아 똑같이 하면 될까?
그래서 MyQueue<> myQueue = new LinkedList<>(); 를 해봤더니 오류가 났다.
그럼 남은 가능성은 LinkedList가 Queue를 구현하도록 되어있다는 것이다.
사실 구현과 상속의 관계만 생각해보면 쉽게 생각할 수 있다...
저번 포스트에 대충 써놨던 LinkedList가 구현하는 것 중 하나인 Deque랑 관련이 있다. Interface Deque도 보면 Queue를 상속받고 있기 때문에 우리가 Queue를 선언할 때 LinkedList를 사용할 수 있는 것이다.