본문 바로가기

심오한 세상/Java; Java FX;

Java Collections API에 대해 모르고 있던 5가지 사항, Part 1

부제 : Java Collections 사용자 정의 및 확장하기

http://www.ibm.com/developerworks/kr/library/j-5things2.html

IBM 기술문서에 올라온 자료입니다.
배열보다 유용한 Collections에 대한 내용입니다.

1. Collections 트럼프 배열
배열의 성능은 Java Collections 라이브러리의 성능에 미치지 못하고 있다고 합니다.
따라서, 배열을 Collections 클래스로 최대한 빨리 변환해서 사용하라고 권장하고 있습니다.
아래는 배열을 변환하는 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class ArrayToList {
    public static void main(String[] args){
        // This gives us nothing good
        System.out.println(args);
 
        // Convert args to a List of String
        List<string> argList = Arrays.asList(args);
 
        // Print them out
        System.out.println(argList);
    }
}

이것의 단점은 수정할 수 없다고 합니다. 새 요소를 추가할려고 하면 UnsupportedOperationException이 발생한다고 합니다.
2. 반복은 비효율적이다.
반복에는 단점이 여러가지가 있다고 합니다.
  • 각각의 추가 또는 제거 후 콜렉션의 크기를 조정해야 하므로 비효율적이다.
  • 잠금을 획득하고, 작업을 수행한 후 잠금을 다시 해제할 때마다 심각한 동시성 문제가 발생할 수 있다.
  • 추가 또는 제거가 발생하는 동안 해당 콜렉션 작업을 수행하려는 다른 스레드에 의해 경쟁 조건이 발생한다.
하지만, Collections에서 제공하는 함수(e.g. addAll 또는 removeAll)을 사용하여 쉽게 처리할 수 있다고 하고 있습니다.

3. For 루프로 Iterable 반복하기
이것은 저도 많이 활용하고 있는 방법입니다.
예전에는 Iterator를 가져온 후 next()를 사용하여 Iterator에 지정된 오브젝트를 가져온 다음 hasNext()를 통해 사용할 수 있는 추가 오브젝트가 있는지 확인하는 과정으로 수동으로 수행해야 했습니다. 하지만 Java 5부터는 이러한 모든 과정을 자동으로 처리하는 for 루프 변형을 자유롭게 사용할 수 있습니다.
Iterable 인터페이스를 구현한 모든 Collections에서 사용 가능합니다.
저 같은 경우는 ArrayList에서 객체를 가져올 때 주로 사용합니다.

1
2
3
4
5
6
7
ArrayList<string> list = new ArrayList<string>();
list.add("item1");
list.add("item2");
list.add("item3");
for (String item : list) {
    // ...
}

위와 같이 주로 사용합니다.

IBM 기술문서에 나온 내용을 이용하여 제가 좀 적어봤는데요.
제가 언급하지 않는 내용도 Collections를 사용하면 굉장히 유용할 것입니다.
나머지는 제가 아직 사용해보지 않아서 어떻게 말씀을 못드리겠습니다.
하지만 위에서 언급한 내용은 정말 유용합니다.

더 많은 내용을 원하시면 위에 링크를 걸어놓은 IBM 기술문서 페이지로 이동하시면 됩니다.