티스토리 뷰

반응형

목차

  1. 컬렉션 프레임워크 소개(자료구조)
  2. List 컬렉션
  3. Set 컬렉션
  4. Map컬렉션
  5. 검색 기능을 강화한 컬렉션
  6. LIFO와 FIFO 컬렉션
  7. 동기화된(synchronized) 컬렉션
  8. 동시실행(concurrent) 컬렉션

컬렉션 프레임워크 소개 : 자료구조

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

* 컬렉션: (사전적 의미) 객체(요소)를 수집해 저장하는 것

* frame : 틀, 골격

* work : 작업

➡️ 객체를 수집해 저장하는 것을 틀에 짜여진대로 작업 하는 것

 

* 배열의 문제점 : 여러개의 객체를 효율적으로 추가,검색,삭제 할때 배열이 가장 간단한 방법이지만..

- 저장할 수 있는 객체 수가 배열을 생성할 때 결정 ➡️ 불특정 다수의 객체를 저장하기에 문제 (개수를 모를때 문제)

- 객체 삭제했을 때 해당 인덱스가 비게 됨 ➡️ 낱알 빠진 옥수수 같은 배열, 객체를 저장하려면 어디가 비어있는지 확인해야 함

 

컬렉션 프레임워크 

* 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리

* java.util 패키지에 포함

* 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용

 

컬렉션 프레임워크의 주요 인터페이스

인터페이스 분류 특징 구현 클래스
Collection List - 순서를 유지하고 저장
- 중복 저장 가능
ArrayList
Vector
LinkedList
Set - 순서를 유지하지 않고 저장
- 중복 저장 안됨
HashSet
TreeSet
Map - 키와 값의 쌍으로 저장
- 키는 중복 저장 안됨
HashMap
Hashtable
TreeMap
Properties

 


List 컬렉션

* 특징 (배열과 유사함)

- 인덱스로 관리

- 중복해서 객체 저장 가능 : 동일한 번지가 참조됨

- null을 저장 : 해당 인덱스는 객체를 참조하지 않음

 

* 객체의 번지를 참조함 

 

* List 컬렉션의 주요 메소드

- E 타입 파라미터 : List 인터페이스가 제네릭 타입 : 구체적 타입은 구현 객체 생성할 때 결정됨


ArrayList

* 객체를 추가하면 인덱스로 관리됨

* 인덱스 검색, 맨 마지막에 객체를 추가하는 경우 좋은 성능을 발휘함

 

* 저장용량

- 초기 용량 : 10 (따로 지정 가능)

- 저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어남. 고정도 가능 : 배열과 차이점

List<String> list = new ArrayList<String>();	//용량 10
List<String> list = new ArrayList<String>(30);	//용량 30

 

* 객체 제거

- 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐

list.remove(인덱스번호);
list.remove(값);

 

list<String> list = new ArrayList<String>();	//컬렉션 생성
list.add("홍길동");				//컬렉션에 객체를 추가
String name = list.get(0);			//컬렉션에서 객체 검색, 제네릭이라 형변환X

 

* 고정된 객체들로 구성된 list를 생성할 때 : Arrays.asList(T ... a) 메소드

List<T> list = Arrays.asList("홍길동", "김자바");

Vector

* Vector 생성

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

 

* 특징

- Vector는 스레드 동기화(synchronization) : 복수의 스레드가 동시에 Vector에 접근해 객체를 추가, 삭제하더라도 안전함

- 한 스레드가 동작하면 다른 스레드는 접근하지 못하도록 막기 때문에 : 이때문에 웹에서는 사용하지 않음


LinkedList

* Linkedlist 생성

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

 

* 특징

- 인접 참조를 링크해서 체인처럼 관리

- 특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경

- 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능을 가짐

인접 참조를 링크해서 체인처럼 관리
중간 객체를 제거할 경우, 앞뒤 링크의 수정이 일어나는 모습

 

* ArrayList와 LinkedList의 차이점

구분 순차적으로 추가 / 삭제 중간에 추가 / 삭제 검색
ArrayList 빠르다 느리다 빠르다
LinkedList 느리다 빠르다 느리다

 


Set 컬렉션

* Set 컬렉션 특징

- 수학의 집합에 비유

- 저장 순서가 유지되지 않음

- 객체를 중복 저장 불가

- 하나의 null만 저장 가능

set 컬렉션은 구슬 주머니와 같다

 

* Set 구현 클래스 : HashSet , LinkedHashSet, TreeSet

 

Set<String> set = ...;
set.add("홍길동");	//객체 추가
set.add("신용권");
set.remove("홍길동");	//객체 삭제

 

* Set 주요 메소드

 

* 전체 객체를 대상으로 한 번씩 반복해 가져오는 반복자(iterator) 제공

- 객체를 꺼내오는 메소드가 없음 : 순서가 없기 때문에, 몇번째 있는걸 꺼내! 라고 할 수 없음

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

 

* 반복자(Iterator) 인터페이스에 선언된 메소드

 

HashSet

* Set 인터페이스의 구현 클래스

생성 방법
Set<E> set = new HashSet<E>();
Set<String> set = new HashSet<String>();

 

* 특징

- 동일 객체 및 동등 객체는 중복 저장하지 않음

- 동등 객체 판단 방법 : hashcode가 같은지 판단 ➡️ equals로 판단 

- hashCode 리턴값 : Object 클래스의 hashcode() 메소드를 오버라이딩 ➡️ 리턴 값 :  비교할 필드명에 점 찍고, hashcode() 붙임


Map컬렉션

* 특징

- 키(key)와 값(value)으로 구성된 Map.Entry 객체를 저장하는 구조

- 키와 값은 모두 객체

- 키는 중복될 수 없음 / 값은 중복될 수 있음

 

* Map 컬렉션 : HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등등

 

* 메소드 : Map 컬렉션에서 공통적으로 사용 가능한 메소드들

Map<String, Integer> map = ~;	//객체 생성
map.put("홍길동", 30);		//객체 추가
int score = map.get("홍길동");	//객체 찾기
map.remove("홍길동");		//객체 삭제

HashMap

* 특징

- 키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 함

- 키 타입은 String 많이 사용 : 문자열이 같을 경우 동등 객체가 될 수 있도록 hashCode()와 equals()메소드가 재정의되어 있기 때문

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

Hashtable

* 특징

- 키 객체 만드는 법은 HashMap과 동일

- Hashtable은 스레드 동기화(synchronization)가 된 상태 : 복수의 스레드가 동시에 접근해서 객체를 추가, 삭제 하더라도 안전

Map<String, Integer> map = new Hashtable<String, Integer>();

Properties

* 특징

- 키와 값이 무조건 String 타입

- 프로퍼티(~.properties) 파일을 읽어 들일 때 주로 사용

 

* 프로퍼티(~.properties) 파일

- 옵션 정보, 데이터베이스 연결 정보, 국제화(다국어) 정보 기록 : 텍스트 파일로 활용

- 애플리케이션에서 주로 변경이 잦은 문자열을 저장 : 유지 보수를 편리하게 만들어줌

- 키와 값이 '=' 기호로 연결되어 있는 텍스트 파일 : ISO 8859-1 문자셋으로 저장 / 한글은 유니코드로 변환되어 저장

 

* 메소드

- load() : 프로퍼티 파일로부터 데이터를 읽기 위해 FileReader 객체를 매개값으로 받음

- Class의 getResource()  : 클래스 파일을 기준으로 상대 경로를 이용해서 프로퍼티 파일의 경로를 얻음. URL 객체로 리턴

- URL 객체의 getPath() : 파일의 절대 경로를 리턴

- getProperty() : 해당 키의 값을 얻음


검색 기능을 강화한 컬렉션

* TreeSet : Set 컬렉션

* TreeMap : Map 컬렉션

* 이진 트리를 사용하기 때문에 검색 속도 향상


이진 트리 구조

* 부모 노드와 자식 노드로 구성

- 왼쪽 자식 노드 : 부모 보다 작은 값

- 오른쪽 자식 노드 : 부모 보다 큰 값

 

* 정렬이 쉬움

- 오름 차순 : 왼쪽 ➡️ 부모 ➡️ 오른쪽

- 내림 차순 : 오른쪽 ➡️ 부모 ➡️ 왼쪽 


TreeSet

* 특징

- 이진 트리를 기반으로 한 Set 컬렉션

- 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

TreeSet<E> treeSet = new TreeSet<E>();

 

* 주요 메소드

- 특정 객체를 찾는 메소드 : first(), last(), lower(), higher(), ...

- 정렬 메소드 : descendingIterator(), descendingSet()

- 범위 검색 메소드 : headSet(), tailSet(), subSet()


TreeMap

* 특징

- 이진 트리를 기반으로 한 Map 컬렉션

- 키와 값이 저장된 Map.entry 저장

- 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

* 주요 메소드

- 단일 노드 객체를 찾는 메소드 : firstEntry(), lastEntry(), lowerEntry(), higherEntry(), ...

- 정렬 메소드 : descendingKeySet(), descendingMap()

- 범위 검색 메소드 : headMap(), tailMap(), subMap()


Comparable과 Comparator

* TreeSet과 TreeMap의 자동 정렬

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

- 숫자(Integer, Double) 타입일 경우, 값으로 정렬

- 문자열(String) 타입일 경우, 유니코드로 정렬

- TreeSet과 TreeMap은 정렬을 위해 java.lang.Comparable을 구현한 객체를 요구함

: Integer, Double, String은 모두 Comparable 인터페이스 구현

: Comparable을 구현하고 있지 않을 경우, 저장하는 순간 ClassCastException 발생

 

- 사용자 정의 클래스에서 compareTo() 메소드를 오버라이딩하여 리턴값을 만들어내야 함

 


LIFO와 FIFO 컬렉션

* LIFO : Last In First Out : 나중에 들어온 것이 먼저 나감 

* FIFO : First In First Out  : 먼저 들어온 것이 먼저 나감


Stack

* 특징

- 나중에 들어온 것이 먼저 나가는 구조

- 응용 예 : JVM 스택 메모리

 

* 메소드


Queue

* 특징

- 먼저 들어온 것이 먼저 나감

- 응용 예 : 작업 큐, 메시지 큐, ...

- 구현 클래스 : LinkedList

 

* 메소드


동기화된(synchronized) 컬렉션

*비동기화된 컬렉션을 동기화된 컬렉션으로 래핑

* Collentions의 synchoronizedXXX() 메소드 제공

- Collections : 인터페이스

 

* 쉽게 이해


병렬 처리를 위한 컬렉션

동기화(Synchronized) 컬렉션의 단점

* 하나의 스레드가 요소 처리할 때 전체 잠금 발생

* 다른 스레드는 대기 상태

* 멀티 스레드가 병렬적으로 컬렉션의 요소들을 빠르게 처리할 수 없음

 

컬렉션 요소를 병렬처리하기 위해 제공되는 컬렉션

* ConcurrentHashMap : 부분(segment) 잠금 사용

- 처리하는 요소가 포함된 부분만 잠금

- 나머지 부분은 다른 스레드가 변경 가능하도록 ➡️ 부분 잠금

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

 

* ConcurrentLinkedQueue : 락-프리(lock-free) 알고리즘을 구현한 컬렉션

- 잠금 사용하지 않음

- 여러 개의 스레드가 동시에 접근하더라도 최소한 하나의 스레드가 성공하도록(안전하게 요소를 저장하거나 얻도록) 처리

Queue<E> queue = new ConcurrentLinkedQueue<E>();
반응형
댓글