728x90

출처 : 자바의 신, The Java™ Tutorials



컬렉션은 목록성 데이터를 처리하는 자료구조를 통칭한다.

컬렉션(때때로 컨테이너라고도 함)은 단순히 여러 요소를 단일 단위로 그룹화하는 개체입니다. 컬렉션은 집계 데이터를 저장, 검색, 조작 및 전달하는 데 사용됩니다. 일반적으로 포커 핸드(카드 모음), 메일 폴더(편지 모음) 또는 전화번호부(이름과 전화번호 매핑)와 같이 자연스러운 그룹을 형성하는 데이터 항목을 나타냅니다.

 

자료구조: Data Structure 여러 데이터를 담을 때 사용

(만약 컬렉션이 아닌 배열에 데이터를 담는다면 배열의 크기를 미리 정해놔야해서 비효율적이고 메모리 낭비가 발생할 수 있다.)

 

자료구조 중에서 저장순서가 중요한 것은 List와 Queue 뿐이다. 

  1. 순서가 있는 목록인 List 형 : 순서가 중요한 데이터 담기에 좋다. 중복 저장이 가능하다.
  2. 순서가 중요하지 않은 목록인 Set형 : 순서 상관없이, 중복되는 것을 방지, 원하는 값이 포함되어있는지 확인이 주 용도
  3. 먼저 들어온 것이 먼저 나가는 Queue형
  4. 키key 값value으로 저장되는 Map형

핵심 컬렉션 인터페이스

Collection— 컬렉션 계층 구조의 루트입니다. 컬렉션은 해당 요소로 알려진 개체 그룹을 나타냅니다. Collection 인터페이스는 모든 컬렉션이 구현하는 최소 공통 분모이며 최대 일반성이 필요할 때 컬렉션을 전달하고 조작하는 데 사용됩니다. 일부 유형의 컬렉션에서는 중복 요소를 허용하고 다른 컬렉션에서는 허용하지 않습니다. Java 플랫폼은 이 인터페이스의 직접적인 구현을 제공하지 않지만 Set 및 List와 같은 보다 구체적인 하위 인터페이스의 구현을 제공합니다.

Set세트 집합— 중복된 요소를 포함할 수 없는 컬렉션입니다. 이 인터페이스는 수학적 집합 추상화를 모델링하고 포커 핸드를 구성하는 카드, 학생의 일정을 구성하는 코스 또는 기계에서 실행되는 프로세스와 같은 집합을 나타내는 데 사용됩니다. 

List목록 — 순서가 지정된 컬렉션(때때로 시퀀스라고도 함)입니다. 목록에는 중복된 요소가 포함될 수 있습니다. 목록 사용자는 일반적으로 목록의 각 요소가 삽입되는 위치를 정확하게 제어할 수 있으며 정수 인덱스(위치)로 요소에 액세스할 수 있습니다. Vector를 사용해 본 적이 있다면 List의 일반적인 특징에 익숙할 것입니다. 

Queue대기열 — 처리 전에 여러 요소를 보유하는 데 사용되는 컬렉션입니다. 기본 컬렉션 작업 외에도 대기열은 추가 삽입, 추출 및 검사 작업을 제공합니다. 대기열은 일반적으로 FIFO(선입선출) 방식으로 요소를 정렬하지만 반드시 그럴 필요는 없습니다. 예외 중에는 제공된 비교기 또는 요소의 자연 순서에 따라 요소를 정렬하는 우선순위 큐가 있습니다. 어떤 순서를 사용하든 대기열의 헤드는 제거 또는 폴링 호출에 의해 제거되는 요소입니다. FIFO 대기열에서는 모든 새 요소가 대기열의 꼬리에 삽입됩니다. 다른 종류의 대기열은 다른 배치 규칙을 사용할 수 있습니다. 모든 대기열 구현은 순서 속성을 지정해야 합니다

Map키를 값에 매핑하는 객체입니다. 맵에는 중복 키가 포함될 수 없습니다. 각 키는 최대 하나의 값에 매핑될 수 있습니다. Hashtable을 사용해 본 적이 있다면 이미 Map의 기본 사항에 익숙할 것입니다. 

마지막 두 개의 핵심 컬렉션 인터페이스는 단순히 Set 및 Map의 정렬된 버전

SortedSet — 요소를 오름차순으로 유지하는 Set입니다. 주문을 활용하기 위해 몇 가지 추가 작업이 제공됩니다. 정렬된 집합은 단어 목록 및 회원 목록과 같이 자연스럽게 정렬된 집합에 사용됩니다. 
SortedMap — 오름차순 키 순서로 매핑을 유지하는 맵입니다. 이것은 SortedSet의 Map 아날로그입니다. 정렬된 맵은 사전 및 전화번호부와 같이 자연스럽게 정렬된 키/값 쌍 컬렉션에 사용됩니다. 

 

 

자바에는 List, Set, Queue는 Collection이라는 인터페이스를 구현하고 있다.

Map은 Collection과 관련없는 별도의 인터페이스를 구현하고 있다.

 

List 인터페이스 : 구현 클래스 ArrayList , Stack

 

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

  1. HashSet 순서필요없는 데이터를 해시테이블에 저장한다. set중에 성능이 가장 좋다.
  2. TreeSet 저장된 데이터의 값에 따라 정렬되는 set. 레드블랙 트리타입으로 값 저장, hashSet보다는 약간 성능 느리다.
  3. LinkedHashSet 연결된 목록 타입으로 구현된 해시테이블에 데이터를 저장한다. 저장된 순서에 따라 값 정렬된다, 대신 성능이 가장 느리다.

 

Map 인터페이스 : 구현 클래스 HashMap, TreeMap, LinkedHashMap ,HashTable

  • HashTable클래스는 Map 인터페이스를 구현하기는 했지만 일반적인 Map 인터페이스를 구현한 클래스들과는 다르다. 
    • Map은 컬렉션 뷰 collection view를 사용하지만 , Hashtable은 Enumeration 객체를 통해서 데이터를 처리한다.
    • Map은 키, 값, 키-값 쌍으로 데이터를 순환하여 처리할 수 있지만 Hashtable은 이중에서 키-값 쌍으로 데이터를 순환하여 처리할 수 없다. 
    • Map은 이터레이션을 처리하는 도중에 데이터를 삭제하는 안전한 방법을 제공하지만, Hashtable은 그러한 기능을 제공하지 않는다. 
기능 HashMap Hashtable
키나 값에 null 저장 가능 여부 가능 불가능
여러 쓰레드에서 동시 접근 가능 여부 불가능 가능

 

Hashtable을 제외한 Map으로 끝나는 클래스들을 여러 쓰레드에서 동시에 접근하여 처리할 필요가 있을 때는 다음과 같이 선언하여 사용한다. 

Map m = Collections.synchronizedMap(new HashMap(...));

 

 

HashMap의 키는 기본 자료형, 참조 자료형 모두 될 수 있지만 주로 int, long나 String 클래스를 키로 많이 사용한다. 

만약 직접 어떤 클래스를 만들어 키로 사용한다면 Object 클래스의 hashCode() 메소드와 equals() 메소드를 잘 구현해 놓아야만 한다!!

 

HashMap에 객체가 들어가면 hashCode() 메소드의 결과 값에 따른 버켓(bucket)이라는 List형태의 저장소가 만들어진다. 만약 서로 다른 키가 저장되었는데 hashCode() 메소드의 결과가 동일하다면 이 버켓에 여러 개의 값이 들어갈 수 있다. 따라서 get()메소드가 호출되면 hashCode()의 결과를 확인하고 버켓에 들어간 목록에 데이터가 여러 개일 경우 equals() 메소드를 호출해 동일한 값을 찾게 된다. 

자세한 내용은 java map buckets을 검색해보자 

 

TreeMap 클래스는 저장하면서 키를 정렬한다. (정렬 순서는 "숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글"

 

 

728x90

+ Recent posts