티스토리 뷰
목차
- 컬렉션 프레임워크 소개(자료구조)
- List 컬렉션
- Set 컬렉션
- Map컬렉션
- 검색 기능을 강화한 컬렉션
- LIFO와 FIFO 컬렉션
- 동기화된(synchronized) 컬렉션
- 동시실행(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 구현 클래스 : 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>();
'Language > JAVA' 카테고리의 다른 글
- Total
- Today
- Yesterday
- not_in
- 파이썬
- 문자열함수
- 순환할당
- StringTokenizer 클래스
- python
- 리스트연산자
- 리스트
- Random 클래스
- 포장 클래스
- Format 클래스
- 딕셔너리
- IndexError
- Pattern 클래스
- Date 클래스
- Math 클래스
- FALSE
- 요소선택
- StringBuffer 클래스
- Objects 클래스
- 프로그램
- 스레드 스케줄링
- 함수
- StringBuilder 클래스
- 기본 API 클래스
- Calendar 클래스
- java.time.package
- 자료형
- Arrays 클래스
- 역반복문
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |