본문 바로가기
Java/study

컬렉션 프레임워크(Collection Framework)

by avvin 2019. 4. 19.

S*프레임워크[ Framework ]

소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적 기능들에 해당하는 부분의 설계와 구현을 재사용 가능하도록 협업화된 형태로 제공하는 소프트웨어 환경을 말한다.

소프트웨어 프레임워크는 지원 프로그램, 컴파일러, 코드 라이브러리, 도구 세트, API 등과 같이 프로젝트나 솔루션 개발을 가능하게 하는 여러 가지 서로 다른 컴포넌트들을 포함한다. 

사용방법을 미리 정해놓은 라이브러리.



컬렉션(Collection)


java.util 패키지에 컬렌션과 관련된 인터페이스와 클래스들이 포함돼있다.


List 인터페이스 구현 클래스 : ArrayList / Vector / LinkedList


Set 인터페이스 구현 클래스 : HashSet / TreeSet


Map 인터페이스 구현 클래스 : HashMap / HashTale  / TreeMap / Properties 


List와 Set은 객체를 추가, 삭제, 검색하는 방법에 많은 공통점이 있기 때문에 공통된 메서드를 모아 Collection 인터페이스로 정의


import java.util.List;

1
public interface List<E> extends Collection<E>
cs

import java.util.Set;
1
public interface Set<E> extends Collection<E>
cs

 <E> : 제네릭타입


Map은 키와 값을 하나릐 쌍으로 묶어서 관리하는 구조


인터페이스 분류 

 특징

 구현클래스

 Collection

 List

 - 순서를 유지하여 저장

 - 중복 저장 가능

ArrayList / Vector / LinkedList 

 Set

 - 순서를 유지하지 않고 저장

 - 중복 저장 불가능

 HashSet / TreeSet

 Map

 -키와 값의 쌍으로 저장

 -키는 중복저장 불가능

  HashMap / HashTale  / TreeMap / Properties 



List 컬렉션


ArrayList


배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, 

ArrayList는 객체 10개를 저장할 수 있는 초기 capacity를 초과한 객체가 들어오면 자동적으로 늘어난다.


자바4 이전까진 객체를 Object타입으로 받아 모든 종류의 객체를 저장할 수 있다는 장점이 있었지만 원소 객체를 찾아올 때마다 타입캐스팅이 일어나고, 

컬렉션에는 일반적으로 같은 타입의 객체들만 들어가기 때문에 자바5 이후에 제너릭을 도입


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


list.add("ㅇㅇㅇ");

list.add("ㅁㅁㅁ");

list.add("ㄹㄹㄹ");


  • asList()

ArrayList는 생성하고 나서 List 변수.add 메서드를 통해 객체를추가하는 것이 일반적이지만, 

생성 시에 객체들로 구성된(고정된 객체들도 구성된) List를 생성할 때에는 Arrays.asList() 사용


List<String> list = Arrays.asList("ㅇㅇㅇ", "ㅁㅁㅁ", "ㄹㄹㄹ");  // ArrayList 아님 new 키워드 X




Vector


List<E> list = new Vector<E>();


ArrayList와 동일한 내부구조를 가지고 있다. 

ArrayList와 다른 점 : Vector는 동기화된 메서드로 구성돼있기때문에 멀티스레드가 동시에 이 메서드들을 실행 할 수 없다. (= 스레드가 안전하다.)



Linked List



Set 컬렉션


Map 컬렉션



검색기능을 강화시킨 컬렉션( TreeSet / TreeMap )


TreeSet 객체와 TreeMap의 키는 저장과 동시에 자동 오름차순 정렬

숫자 타입일 경우엔 값으로 정렬(숫자로 정렬), 문자열 타입일 경우엔 유니코드로 정렬


TreeSet 객체와 TreeMap의 키는 정렬을 위해 java.lang.Comparable을 구현한 객체

정렬자 : Comparator 인터페이스를 구현한 객체

Integer, Double, String 모두 Comparator 인터페이스를 자동정렬이 되게끔 구현( compareTo() 메서드 재정의 )하고 있으며, 

사용자 정의 클래스도 Comparable 인터페이스를 구현하면 자동 정렬이 가능하다. 



Stack 클래스 / Queue 인터페이스


Stack클래스를 이용한 대표적인 예가 JVM의 스택 메모리

Queue를 이용한 대표적인 예가 스레드풀(ExecutorService)의 작업 큐 

Stack은 클래스라서 new를 통해 기본생성자를 호출하여 객체를 생성하면 되지만

Queue는 인터페이스이기 때문에 구현클래스의 객체를 생성하여 Queue 타입 변수에 대입한다. 

대표적인 Queue 인터페이스 구현클래스로 LinkedList 가 있으며  LinkedKist는 List 인터페이스도 구현한다.



동기화된 컬렉션


Vector와 Hashtable은 동기화된 메서드로 구성되어있기 때문에 멀티스레드 환경에서 안전하게 요소를 처리할 수 있지만 (= 스레드가 안전하다.)

나머지는 동기화된 메서드로 구성돼있지 않아 멀티스레드 환경에서는 안전하지 않다.


Collection은 이러한 문제를 해결하기 위해 Collection.synchronizedXXX() 메서드 제공

 : 매개값으로 받은 컬렉션의 메서드를 동기화하여 컬렉션 객체를 리턴해준다.


List<T> list = Collection . synchronizedList( new ArrayList<T>() );


List를 동기화된 List로 리턴


Set <E> set = Collection . synchronizedSet( new HashSet<E>() );


동기화된 Set을 반환


Map <K, V> map = Collection . synchronizedMap( new HashMap<K,V>() );


동기화된 Map을 반환




병렬처리를 위한 컬렉션


동기화된 컬렉션은 멀티스레드가 컬렉션의 요소를 병렬적으로 처리할 수 없기때문에 전체요소를 빠르게 처리할 수 없다. (교재에는 예제 X)


java.util.concurrent 패키지의 

Class ConcurrentLinkedQueue<E>

Queue<E> = new ConcurrentLinkedQueue <E>();

:

Class ConcurrentHashMap<K,V>

Map<K,V>map = new ConcurrentHashMap<K,V>();


: 부분 잠금(segment lock) 사용. 

컬렉션에 10개의 요소가 저장돼있는 경우 1개를 처리할 동안 전체 10개의 요소를 다른 스레드가 처리하지 못하도록 하는 것이 전체잠금이라면,

처리하는 요소가 포함된 부분만 잠금하고 나머지 부분은 다른 스레드가 변경할 수 있도록 하는 것이 부분잠금







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

병렬 처리 (스트림과 병렬처리 뒷부분)  (0) 2019.04.21
스트림과 병렬처리  (0) 2019.04.20
로컬 객체의 로컬 변수, 매개 변수 사용  (0) 2019.04.19
람다식(Lambda Expression)  (0) 2019.04.18
제네릭(Generic)  (0) 2019.04.17