컬렉션 (Collection)_Set & Map

Brogod97·2022년 12월 29일
0

KH TIL

목록 보기
27/37
post-thumbnail

Set

주머니 모양

저장 순서가 유지되지 않고, 중복 객체도 저장하지 못하게 하는 자료 구조

null도 중복을 허용하지 않기 때문에 1개의 null만 저장

구현 클래스로 HashSet, LinkedHashSet, TreeSet이 있음

Set 계열 주요 메소드 ⭐

Set & List : 콜렉션 인터페이스
Set & List + Map : 자바의 콜렉션

  • 전체 객체 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공 인덱스로 객체에 접근할 수 없음

HashSet

Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠름

동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않음

LinkedHashSet

HashSet과 거의 동일하지만 Set에 추가되는 순서를 유지한다는 점이 다름

Enumeration, Iterator, ListIterator

컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스

  • Enumeration : Iterator의 구버전
  • ListIterator    : Iterator를 상속받아 양방향 특징

[그림 1]의 상속구조 때문에 iterator() 메소드는 List와 Set 계열에서만 사용

🡪 Map의 경우 Set 또는 List화 시켜서 iterator()를 사용해야 함


Map

Key 값은 꼭 숫자가 아님


Key : Value (Key = Value)

// Map 객체 1
"name" : "홍길동"
"adress" : "서울"

// Map 객체 2
"name" : "고길동"
"adress" : "인천"

키(key)와 값(value)으로 구성되어 있으며, 키와 값은 모두 객체

키는 중복 저장을 허용하지 않고(Set방식), 값은 중복 저장 가능(List방식)

키가 중복되는 경우, 기존에 있는 키에 해당하는 값을 덮어 씌움

구현 클래스로 HashMap, HashTable, LinkedHashMap, Properties, TreeMap이 있음

Map 계열 주요 메소드 ⭐

  • List & Set은 값 추가 add() 였는데, Map은 put(key, value) 사용

  • Map에 담겨있는 요소들에 순차적으로 접근하기 위한 방법

    1. ketSet() : keySet()으로 Map의 Key를 Set에 담은 후 Set에 있는 iterator를 통해 접근
    2. entrySet() : entrySet()으로 Map의 Key와 Value를 Set에 담은 후 Set에 있는 Iterator를 통해 접근

HashMap

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

때문에 키 타입은 hashCode와 equals()메소드가 재정의되어 있는 String타입을 주로 사용

// 제네릭 타입 2개
Map<K, V> map = new HashMap<K, V>();

Hashtable

키 객체 만드는 법은 HashMap과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에,

복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드에 안전 (Thread safe)

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

Properties

키와 값을 String타입으로 제한한  Map컬렉션

주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로 사용

프로퍼티(*.properties) 파일

  • 옵션정보, 데이터베이스 연결정보, 국제화(다국어)정보를 기록하여 텍스트 파일로 활용
  • 애플리케이션에서 주로 변경이 잦은 문자열을 저장하여 관리하기 때문에 유지보수를 편리하게 만들어 줌
  • 키와 값이 ‘=‘기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장되고, 한글은 유니코드(Unicode)로 변환되어 저장

TreeSet과 TreeMap

검색 기능을 강화시킨 컬렉션으로, 계층 구조를 활용해 이진 트리 자료구조를 구현하여 제공

  • 트리 : 각 노드 간 연결된 모양이 나무와 같다고 해서 붙여진 이름

tree 구조는 루트 노드, 부모 노드와 비교해서 작으면 왼쪽 크면 오른쪽

읽을 땐 왼쪽부터

TreeSet

이진 트리를 기반으로 한 Set컬렉션으로, 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

TreeMap

이진 트리를 기반으로 한 Map 컬렉션으로, 키와 값이 저장된 Map.Entry를 저장하고

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

TreeSet, TreeMap 정렬

오름차순(기본 정렬)

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

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

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

  • 정렬을 위해 java.lang.Comparable을 구현한 객체 요구
    그러지 않을 경우 ClassCastException 발생
    (Integer, Double, String 모두 Comparable 인터페이스를 통해 오름차순이 구현되어 있음)

내림차순(따로 구현)

  • TreeSet, TreeMap 객체 생성 시 매개변수 생성자를 통해 재정렬 가능

    ex. TreeSet tSet = new TreeSet(Comparator<? super E> comparator);

      TreeMap<K, V> tMap = new TreeMap(Comparator<? super K> comparator);
  • 또 다른 방법으로 숫자(Integer, Double), 문자열(String) 타입을 제외한 Comparable을
    상속 받는 객체인 경우 compareTo() 메소드의 오버라이딩 부분을 내림차순으로 변경

SortedSet과 SortedMap

검색 기능을 강화시킨 컬렉션으로 계층 구조를 활용하여 이진 트리 자료 구조를 구현하여 제공

Stack

후입선출(LIFO : Last In First Out) 구조로 JVM Stack 메모리가 Stack구조로 되어 있음

Stack<E> stack = new Stack<E>();

Queue

선입선출(FIFO : First In First Out) 구조로 작업 큐나 메시지 큐가 Queue구조로 되어 있음

Queue() queue = new LinkedList();

Deque

큐와 스택의 성질을 모두 가지고 있는 구조로 검색과 같은 반복적인 문제에 특히 유용한 데이터 구조

참고 : Collection 사용 정리

  • List Interface

    • ArrayList : 상대적으로 빠르고 요소에 대해 순차적으로 접근할 수 있다.

    • Vector : ArrayList의 이전 버전이며 모든 메서드가 동기화 되어 있다.

    • LinkedList : 순서가 변경되는 경우 노드 링크만 변경하면 되므로 삽입, 삭제가 빈번 할 때 빠르다.

  • Set Interface

    • HashSet : 빠른 접근 속도를 가지고 있으나 순서를 예측할 수 없다.

    • LinkedHashSet : 요소가 추가된 순서대로 접근할 수 있다.

    • TreeSet : 요소들의 정렬 방법을 직접 지정할 수 있다.

  • Map Interface

    • HashMap : 중복을 허용하지 않고 순서를 보장하지 않으며 null 값을 허용한다.

    • Hashtable : HashMap 보다는 느리지만 동기화를 지원하며 null 값을 허용하지 않는다.

    • TreeMap : 정렬된 순서대로 Key와 Value를 저장하므로 빠른 검색이 가능하지만 요소를 추가할 때 정렬로 인해 오래걸린다.

LinkedHashMap

: HashMap과 기본적으로 동일하지만 입력한 순서대로 접근이 가능하다.

0개의 댓글