Programming/Java

[Interface] List, Set, Map

goakgoak 2018. 10. 1. 23:35

Java Collection Framwork(JCF)

  • java에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 것을 의미한다. 다음은 JCF의 상속구조이며 사용 용도에 따라 List, Set, Map으로 요약할 수 있다.

List

  • 특징

    • List는 배열과 비슷한 Java의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.

    • 배열은 크기가 정해져 있지만, List는 메모리가 허용하는 한 계속해서 추가해서 사용할수 있기 때문에 동적으로 자료형의 갯수가 가변하는 상황이라면 List 를 사용하는 것이 더 유리하다.

    • 원하는 데이터가 뒤쪽에 위치하는 경우 속도에서의 문제가 있다.

    • 구현 클래스에는 ArrayList(배열 리스트), LinkedList(연결 리스트)가 있다.

ArrayList(배열 리스트)
  • ArrayList는 배열을 기반으로 구현한 리스트이다.

  • 각 데이터는 Index를 가지고 있기 때문에, 데이터 검색에는 유리하다.

  • 데이터의 갯수가 변하지 않는 경우에 효과적이고, 잦은 데이터의 변경은 성능이 하락된다.

  • 탐색은 빠르지만(Index를 사용하기 때문), 데이터 추가/삭제가 느리다.

  • https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

LinkedList(연결 리스트)
  • 메모리 동적 할당을 기반으로 구현한 리스트이다.

  • 각각의 노드가 이전 노드와 다음 노드의 정보를 가지고 있어서 데이터의 추가, 삭제가 빠르다.

  • N 번째 요소에 대한 탐색이 시작지점부터 순차적으로 가야하기 때문에 느리다.

  • 탐색은 느리지만 추가/삭제가 빠르다.

  • https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

Set

  • 특징

    • Set 역시 Collection의 일부이며 한글로는 "집합" 이라고 한다. 이 Set은 집합의 성질을 가지고 있다

    • 저장되는 데이터의 순서를 상관하지 않고, 중복되지 않게 저장하는 자료구조이다.

    • Set의 장점은 빠른 속도이다.

    • 구현 클래스에는 HashSet, TreeSet이 있다.

HashSet
  • 저장되는 데이터의 순서를 파악할 수 없다.

  • Set에서 가장 빠른 데이터 접근 속도를 가지고 있다.

  • 1단계 : 최상위인 Object 클래스의 hashCode 메소드의 반환값을 해시값으로 받는다.

  • 2단계 : equals 메소드의 결과를 이용하여 해시값이 같은지 다른지 판단한다.

  • 해시값을 이용하여 검색하기 때문에 검색하는 범위가 엄청 줄어들게 되어 검색속도가 매우 빠르고 , 2단계를 거쳐 데이터중복도 원천 차단하게된다.

  • https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

TreeSet
  • 저장되는 데이터의 순서를 파악할 수 없다.

  • 데이터의 중복저장이 안된다.

  • 이진탐색트리(BST)를 이용한 데이터 검색

    • BST : 키값에 따라 노드의 위치를 정의한 탐색트리

    • 모든 노드는 유일한 키값을 갖는다.

    • 왼쪽노드는 루트의 키보다 작다.

    • 오른쪽 노드는 루트의 키보다 크다. // 왼쪽 < 루트 < 오른쪽

    • 모든 서브 트리도 BST이다.

  • https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

Map

  • 특징

    • 맵(Map)은 사전과 비슷하다. 즉 "people" 이란 단어에 "사람" 이라는 뜻이 부합되듯이 key와 value라는 것을 한 쌍으로 가지고 이러한 대응관계흫 쉽게 표현해주는 Java의 자료형이다.

    • 데이터의 순서는 없으며, 키에 대한 중복은 없다.

    • key에 대한 검색 속도가 속도를 좌우한다.

    • 구현 클래스에는 HashMap, TreeMap이 있다.

HashMap
  • 리스트나 배열처럼 순차적으로 해당요소 값을 구하지 않고 key를 통해 value를 얻는다.4

  • "baseball" 이라는 단어의 뜻을 찾기 위해서 사전 내용을 순차적으로 모두 검색하는 것이 아니라 "baseball" 이라는 단어가 있는 곳만 펼쳐보는 것이다.

  • https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

TreeMap
  • 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장, 검색과 정렬에 적합한 컬렉션 클래스이다.

  • HashMap은 데이터의 정렬이 불가능하지만 데이터의 key를 기준으로 정렬할 경우에 유용하게 사용할 수 있는 것이 TreeMap 클래스이다.

  • 정렬 기준 : 숫자 > 알파벳 대문자 > 한글

  • https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

Question. HashSet과 HashMap의 차이점은 무엇일까?

  • HashSet은 집합이다. 예. {1, 2, 3, 4, 5}

  • HashMap은 (키-값)의 맵이다. 예. { (a-1), (b-2), (c-1) }

  • 기본적으로 HashMap에서 사용자는 key와 value를 모두 제공해야하지만 HashSet에서는 Value 만 제공하고 key는 해시함수를 사용하여 value에서 자동으로 파생된다.

각 인터페이스의 특징

인터페이스구현 클래스특징
ListArrayList, LinkedList순서가 있는 데이터의 집합, 데이터 중복 허용
SeHashSet, TreeSet순서 유지되지 않음, 데이터 중복 허용하지 않음
MapHashMap TreeMap(키, 값) 쌍으로 이루어진 데이터 집합,순서 유지되지 않고, 키는 중복 허용하지 않으며 값의 중복 허용