본문 바로가기
Programing/Java

Java Collection Framework

by Tomining 2016. 9. 30.

컬렉션이란 여러 개의 객체를 하나의 그룹으로 묶을 있는 일종의 컨테이너입니다.

Java Collection Framework(이하 JCF)에는 컬렉션 구현체들이 있습니다. 컬렉션에 독립적인 코드를 쉽게 작성할 있도록 JCF Collection 인터페이스라는 공통 인터페이스를 제공하고 있습니다.

 

Collection 인터페이스

 

Collection 인터페이스는 Set, List, Queue 상위 인터페이스로 가지 핵심 메서드를 갖고 있습니다.

메소드

설명

boolean add(E e)

boolean addAll(Collection<? extends E> c)

e를 추가하거나 c 들어 있는 요소를 추가한다. 컬렉션이 변경되면 true 반환한다.

boolean remove(Object o)

boolean removeAll(Collection<?> c)

boolean retainAll(Collection<?> c)

boolean removeIf(Perdicate<? super E> filter)

void clear()

각각 o 객체, c 들어 있는 요소, c 없는 요소, 일치하는 요소, 모든 요소를 제거한다. 처음 가지 메서드는 컬렉션이 변경되면 true 반환한다.

int size()

컬렉션에 들어 있는 요소의 개수를 반환한다.

boolean isEmpty()

boolean contains(Object o)

boolean containsAll(Collection<?> c)

컬렉션이 비어 있거나, o 포함하거나, c 들어 있는 모든 요소를 포함하면 true 반환한다.

Iteractor<E> iterator()

Stream<E> stream()

Stream<E> parallelStream()

Spliterator<E> spliterator()

컬렉션 요소를 방문하는 반복자, 스트림, 병렬 스트림, 분할반복자를 반환한다.

Object[] toArray()

T[] toArray(T[] a)

컬렉션의 요소를 담은 배열을 반환한다. 번째 메서드는 a 길이가 충분하면 a 배열에 요소를 담아 반환한다

 

Set, List, Queue 외에도 Map 있습니다. Map 경우 Collection 인터페이스를 상속받고 있지 않지만 컬렉션으로 분류됩니다.

 

Collection 인터페이스의 상속 구조는 아래와 같습니다.

 

 

 

인터페이스는 아래와 같은 특징을 가집니다.

인터페이스

구현 클래스

특징

Set

HashSet

LinkedHashSet

TreeSet

순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.

List

ArrayList

Vector

LinkedList

순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.

Queue

LinkedList

PriorityQueue

List 유사

Map

HashTable

LinkedHashMap

HashMap

TreeMap

(Key) (Value) 쌍으로 이루어진 데이터의 집합이다. 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다.

 

 

Set 인터페이스

 

집합을 정의하며 요소의 중복을 허용하지 않습니다. Set에서 별도로 정의한 메서드는 없습니다.

 

Set 구현체에는 아래와 같은 것이 있습니다.

  • HashSet
    • 가장 빠른 임의 접근 속도
    • 순서를 전혀 예측할 없음
  • LinkedHashSet
    • 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능
  • TreeSet
    • 정렬된 순서대로 보관, 정렬 방법을 지정할 있음

 

List 인터페이스

 

Collection 인터페이스를 확장한 자료형으로 요소들의 순서를 저장하여 색인(index) 사용하여 특정 위치에 요소를 삽입하거나 접근할 있습니다. 중복 요소들이 허용됩니다.

 

List 구현체에는 아래와 같은 것이 있습니다.

  • ArrayList
    • 상당히 빠르고 크기를 마음대로 조절할 있는 배열
    • 단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있음
  • Vector
    • ArrayList 구형 버전. 모든 메서드가 동기화되어 있음
    • 쓰이지 않음
  • LinkedList
    • 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 빠른 성능을 보장
    • 스택, , 양방향 등을 만들기 위한 용도로 쓰임

 

Map 인터페이스

 

(Key) (Value) 쌍으로 이루어진 데이터 집합입니다.

 

Map 구현체에는 아래와 같은 것이 있습니다.

  • HashMap
    • Map 인터페이스를 구현하기 위해서 HashTable 사용한 클래스
    • 중복을 허용하지 않고 순서를 보장하지 않음
    • 키와 값으로 null 허용
  • HashTable
    • HashMap보다는 느리지만 동기화 지원
    • 키와 값을 null 허용되지 않음
  • LinkedHashMap
    • HashMap 상속받아 HashMap 유사
    • Map 있는 엔트리들이 연결 리스트로 유지되므로 입력한 순서대로 반복 가능
  • TreeMap
    • 이진 검색 트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장
    • 정렬된 순서로 / 쌍을 저장하므로 빠른 검색이 가능
    • 저장시 정렬(오름차순) 하기 때문에 저장 시간이 다소 오래 걸림

 

Map 인터페이스와 구현체의 상속 구조는 아래와 같습니다.

 

 

 

기타 컬렉션

 

Properties

 

Properties 클래스는 텍스트 형식으로 쉽게 저장하고 불러올 있는 맵을 구현합니다. 이런 맵은 보통 프로그램의 설정 옵션을 저장하는 용도로 사용합니다. 예를 들어 다음과 같습니다.

 

Propertiessettings = newProperties();

settings.put("width", "200");

settings.put("title", "HelloWorld");

try(OutputStreamout = Files.newOutputStream(path)){

settings.store(out, "ProgramProperties");

}

 

대표적으로 System.getProperties() 있는데, 이는 시스템 프로퍼티가 담긴 Properties 객체를 반환합니다.

시스템 프로퍼티가 담고 있는 정보는 아래와 같습니다.

 

프로퍼티

설명

user.dir

가상 머신의 현재 작업 디렉터리

user.home

사용자 디렉터리

user.name

사용자 계정 이름

java.version

가상 머신의 자바 실행 환경 버전

java.home

자바 설치본의 디렉터리

java.class.path

가상 머신을 실행하는 이용한 클래스 패스

java.io.tmpdir

임시 파일 저장에 적합한 디렉터리(예를 들면 /tmp)

os.name

운영체제 이름(예를 들면 Linux)

os.arch

운영체제 아키텍처(예를 들면 amd64)

os.version

운영체제 버전(예를 들면 3.13.0-34-generic)

file.seperator

파일 구분자(유닉스는 /이고 윈도는 \)

path.seperator

경로 구분자(유닉스는 :이고 윈도는 ;)

line.seperator

넘김 구분자(유닉스는 \n이고 윈도는 \r\n

 

EnumSet & EnumMap

 

열거형 데이터 집합을 모으려면 EnumSet 클래스를 사용해야 합니다. EnumSet 클래스는 공개 생성자가 없습니다. 그래서 정적 팩토리 메서드로 집합을 생성합니다. EnumSet 다룰 때는 Set 인터페이스를 사용합니다.

 

생성하는 예제 코드는 아래와 같습니다.

 

enumWeekDay{MONDAY, TUESDAY, WDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

Set<WeekDay>always = EnumSet.allOf(WeekDay.class);

Set<WeekDay>never = EnumSet.noneOf(WeekDay.class);

Set<WeekDay>workday = EnumSet.range(WeekDay.MONDAY, WeekDay.FRIDAY);

Set<WeekDay>mwf = EnumSet.of(WeekDay.MONDAY, WeekDay.WDNESDAY, WeekDay.FRIDAY);

 

EnumMap 열거 타입에 속하는 키가 포함된 맵이며, 값의 배열로 구현됩니다.

 

예제 코드는 아래와 같습니다.

 

EnumMap<WeekDay,String>personInCharge = newEnumMap<WeekDay,String>(WeekDay.class);

personInCharge.put(WeekDay.MONDAY,"Fred");

 

참조