본문 바로가기

Java/JAVA

자바 컬렉션 (Collection)

반응형

컬렉션 (Collection)

자료 구조의 구현체, 독립적인 코드를 쉽게 작성할 수 있게 컬렉션 프레임워크는 공통 인터페이스를 제공한다.

컬렉션 메서드

boolean add(E e) : e를 추가하고 변경되면 true 리턴

boolean remove(Object o) : o 객체를 제거한다. 변경되면 true 리턴

int size() : 컬렉션에 들어 있는 요소의 개수를 리턴

boolean isEmpty() : 컬렉션이 비어있으면 true 리턴

boolean contains(Object o) : o 객체를 포함하면 true 리턴

Iterator<E> iterator() : 컬렉션의 요소를 방문하는 반복자를 리턴

Stream<E> stream() : 컬렉션 요소를 방문하는 스트림 리턴

컬렉션 기본

List의 큰 특징은 n번째 요소에 접근하는 메서드를 제공하는 것이다.

ArrayList클래스와 LinkedList클래스 둘다 List 인터페이스를 구현한다.

LinkedList가 중간에 요소를 삽입하는 일을 빠르게 수행한다. 하지만 중간까지 이르는 과정은 처음부터 모든 링크를 따라가야 해서 느리다.

Set은 요소를 특정 위치에 삽입하지 않으며, 중복을 허용하지 않는다.

SortedSet에는 정렬 순서로 요소를 순회하는 기능이 있으며, NavigableSet은 이웃 요소를 찾는 메서드가 있다.

***중요*** 코드를 작성할 때는 가능하면 인터페이스를 사용하는게 좋다 예를 들어 ArrayList를 생성한 후에는 해당 참조를 list타입 변수에 저장하는 것이다.

List<String> words = new ArrayList<>();

컬렉션을 처리하는 메서드를 구현할 때는 가장 덜 제한적인 인터페이스를 파라미터 타입으로 사용해야 한다.

보통 Collection, List, Map 이면 충분하다.

Set은 중복되지 않는 만 저장한다.

반복자 (Iterator)

Collection<String> coll = ...;

Iterator<String> iter = coll.iterator();

while(iter.hasNext()){

String element = iter.next();

...

}

* 한 자료구조를 방문 중인 반복자가 여러개 있을 때, 그 반복자 하나가 해당 자료구조를 변경하면 나머지는 유효하지 않은 반복자가 될 수 있다 그러면 ConcurrentModificationException를 던진다.

집합 (Set)

Set은 어떤 값이 요소인지 효율적으로 테스트할 수 있으나 요소를 추가한 순서는 기억하지 않는다.

Set은 순서가 중요하지 않을 때 유용하다. 예를 들어 나쁜 단어를 사용자 명으로 쓸 수 없게 할 때이다.

HashSet과 TreeSet클래스는 Set인터페이스를 구현한다.

요소에 적용할 좋은 해시 함수가 있을 때는 HashSet이 더 효율적이다. String/Path같은 라이브러리 클래스는 좋은 해시 함수를 사용한다.

정렬된 순서로 집합을 순회하려면 TreeSet을 사용하면 된다.

TreeSet은 반드시 Comparable 인터페이스를 구현해야 한다.

맵 (Map)

맵은 키, 값을 저장한다.

Map<String, Integer> counts = new HashMap();

counts.put("Alice",1); //추가

counts.put("Alice",2); // 기존 Alice의 값을 2로 변경 즉, 수정

* 키를 정렬 순서로 방문해야 하는 경우가 아니라면 보통은 해시 맵을 선택하는게 좋다.

정렬순서로 방문하고 싶으면 TreeMap을 사용하면 된다.

V get(Object key) : key가 null이 아닌 값v와 연고나되어 있으면 v를 반환한다. 그렇지 않으면 null또는 defaultValue를 리턴

V put(K key,V value) : key, value를 연관시키고 value를 리턴

** HashMap처럼 null을 허용하는 맵을 이용할 때는 null값을 사용할 때 매우 주의해야한다. 많은 맵 메서드가 null 값을 엔트리가 없다는 의미나 엔트리를 제거하는 의미로 해석하기 때문이다.



반응형

'Java > JAVA' 카테고리의 다른 글

입출력 스트림 (I/O Stream)  (0) 2017.05.26
기타 컬렉션  (0) 2017.05.25
제네릭 클래스 (generic class)  (0) 2017.05.24
로깅  (0) 2017.05.23
예외 (Exception)  (0) 2017.05.23