2019년 3월 16일 토요일

[Java] Collections

Java로 프로그래밍을 할 때, Collection, Iterator, Iteratable 등에 대해서 헷갈렸는데, 이 참에 정리를 하려고 합니다! 혹시 저와 같이 평소에 헷갈리셨던 분들 차근차근 같이 공부해보아요! 

Java Collections Framework는 흔히 사용되는 자료구조들을 구현한 클래스와 인터페이스로 이루어져 있습니다. Collections Framework라고 하지만 우리는 라이브러리처럼 사용하고 있죠. 

배열과의 차이점

Collections와 Arrays의 공통점은 여러 객체를 가지고 있으면서 하나의 그룹으로 다룰 수 있다는 점입니다. 하지만 중요한 차이점은 Collections은 초기화 할 때 capacity를 지정해 줄 필요가 없다는 것입니다. 또 다른 차이점은 Collections는 Java의 primitive type(int, long, char, ...)을 참조할 수 없다는 것인데요. 그래서 우리는 Collections을 사용할 때 아래 처럼 이것들의 Wrapper class를 이용하죠. 


List<Integer> list = new ArrayList<Integer>();



역사

pre-JDK 1.2에 구현되어 있던 Collection에는 자료 구조가 별로 없었어요. 당시 Java에서 객체 그룹화를 위해 사용했던 것은 array, Vector, HashTable 클래스였고 확장이 쉽지 않았으며 표준화된 함수 인터페이스를 구현하지 않았었습니다. 어떤 상황이냐면 array는 []로, Vector는 elementAt으로 HashTable은 get, put을 사용하는 상황으로 각기 다른 메소드를 사용해서 멤버에 접근했습니다. 

사람들은 Collection 자료구조 라이브러리를 직접 만들어서 사용하고 있었는데 그 중 가장 유명했던 것이  Doug Lea의  Collections package였습니다. 


Collections framework는 Joshua Bloch 주도하에 개발되어 JDK 1.2에 공개되었고, Doug Lea의 Collection 라이브러리를 참고해서 만들어졌습니다. 



Architecture

Collection에는 어떤 인터페이스가 선언되어 있는지 한 번 보도록 하겠습니다.

위 링크로 들어가보면 Java Platform SE 8 버전의 Collection 문서를 볼 수 있습니다.

맨 처음을 보시면 Collection이 Iterable<E>를 상속한 인터페이스인 것을 알 수 있습니다.
그 다음 Collection<E>를 상속한 인터페이스들, 즉  Collection의 subinterface 리스트가 보입니다. 
그 다음 Collection class를 구현한 클래스 리스트를 볼 수 있습니다.


조금 밑으로 내려가보시면 메소드를 타입별로 볼 수 있습니다. Abstract methods를 보시면 우리가 Collection 인터페이스를 다룰 때 꼭 사용하게 되는 
  • add
  • remove
  • toArray
  • contains
위 메서드들이 보입니다. Collection을 구현한 클래스들, 아래 그림에서 보면 TreeSet, LinkedList, ArrayList 등이 있는데요. 이 클래스들은 각각의 자료구조에 맞게 위 메소드들을 구현했을 것입니다.


위키 문서에서 제공하는 Collection의 hierarchy를 나타낸 이미지입니다. 위 그림에 Map은 빠져있고 아래에 따로 제공되어 있는데 이유를 잘 모르겠습니다. 후에 이유를 알았는데 Java의 Collections Framework는 크게 Collection과 Map 인터페이스로 나눌 수 있고 이것을 상속하는 다른 인터페이스와 클래스들로 구성됩니다. 즉 Map 인터페이스는 Java Collections 라이브러리에 속한 인터페이스이지만 Collection 인터페이스를 상속한 인터페이스는 아닌 것이죠. 


Collection은 3개의 타입으로 나눌 수 있는데요. 
타입특징해당 인터페이스
ordered list순서가 있는 리스트List, Queue
dictionaries/mapKey를 이용하여 객체에 접근Map
sets순서가 없는 collectionSet



Java를 사용할 때 Collection 프레임워크의 인터페이스나 클래스에 대해 잘 모르고

List<Integer> list = new List<Integer>();
위와 같은 실수를 할 때가 있습니다. Java의 List는 인터페이스이므로 위와 같이 선언할 수 없습니다. 


List<Integer> list = new LinkedList<Integer>();
위 코드 처럼, List 인터페이스를 구현한 클래스 중 하나를 선언해야 합니다.이제 Java의 Collection framework가 어떤 구조로 되어 있는지 알았으니 저런 실수는 하지 않겠죠~?! 



출처/참고: https://en.wikipedia.org/wiki/Java_collections_framework

댓글 없음:

댓글 쓰기