[Java] Collections Framework

김하밍·2024년 3월 14일
0

Java

목록 보기
33/46

Collections Framework (컬렉션 프레임워크)
java.util 패키지에서 제공하는 자료구조를 사용해서 추가/삭제/검색 할 수 있도록 인터페이스와 구현 클래스 모음 입니다.

  • 가장 큰 카테고리인 Collection과 Map 으로 나뉩니다.

주요 인터페이스와 구현한 클래스

  • List
    • ArrayList
    • Vector
    • LinkedList
  • Set
    • HashSet
    • TreeSet
  • Queue
    - PriorityQueue
  • Map
    • SortedMap
      • TreeMap
    • HashMap
    • Hashtable
    • Properties

List

  • List는 순서가 있는 데이터의 집합을 표현하는 인터페이스입니다.
  • List의 구현 클래스로는 ArrayList와 LinkedList가 주로 사용됩니다.
  • 자동으로 증가될 수 있는 형태의 컨테이너가 필요할 때 사용합니다.
  • List는 배열과 같은 방이 있을 때, 다른 인덱스에 같은 값이 들어가도 무방합니다.

ArrayList

List<String> list1 = new ArrayList<String>();
  • ArrayList는 내부적으로 배열을 사용하여 요소들을 관리합니다.
  • 동적 배열로 크기가 자동으로 조절되며, 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
  • 요소의 삽입과 삭제가 느리지만, 요소의 검색이 빠르고 메모리를 적게 사용합니다.

LinkedList

List<String> list2 = new LinkedList<String>();
  • LinkedList는 이중 연결 리스트로 구현되어 있습니다.
  • 각 요소는 자신의 이전 요소와 다음 요소에 대한 참조를 가지고 있어서 삽입과 삭제가 빠릅니다.
  • 하지만 요소의 검색이 느리고 메모리를 많이 사용합니다.

Set

Set<E> set = new HashSet<E>();
  • Set은 순서가 없는 데이터의 집합을 표현하는 인터페이스입니다.
  • Set의 구현 클래스로는 HashSet, TreeSet 등이 있습니다.
  • 관리해야되는 데이터가 중복적으로 저장되어 있지 않은 형태의 컨테이너가 필요하다면 사용합니다. (고유한 값을 저장)
  • Set은 배열과 같은 방이 있을 때, 다른 인덱스에 같은 값이 들어갈 수 없습니다.
  • 인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드는 없습니다.
    대신, Iterator() 메소드를 호출하여 얻을 수 있습니다.

HashSet

  • Set 인터페이스의 구현 클래스 입니다.
  • HashSet은 해시 테이블을 사용하여 요소들을 관리합니다.
  • 중복된 요소를 허용하지 않으며, 해시 함수를 사용하여 요소들을 분산시켜 저장합니다.

문자열을 HashSet에 저장할 경우에 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 다른 문자열은 갖는 String 객체는 다른 객체로 간주됩니다.
그 이유는 String 클래스가 Object의 메소드는 hashCode()와 equals() 를 재정의해서 같은 문자열일 경우 hashCode()의 리턴값은 같게, equals() 리턴값은 true가 나오도록 했기 때문입니다.

  • HashSet이 판단하는 동일한 객체의 기준:
    • 같은 인스턴스 X
    • (1) hashCode() 메소드를 호출해서 해시코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교합니다.
      만약 동일한 해시코드가 있다면 다시 (2) equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하여 중복 저장을 하지 않게 됩니다.

동등 객체의 조건

(1) hashCode()의 리턴값이 같아야 합니다.
(2) equals() 메소드가 true를 리턴해야 합니다.

(사용 예제)

  • 값을 가져올 때:
    hasNext() 메소드를 사용해서 객체가 있는지 확인한 후에 next() 메소드를 사용해서 불러옵니다.

  • 값을 삭제할 때:
    equals() 메소드로 찾을 객체를 검색한 후에 remove() 메소드로 삭제합니다.


Vector

  • ArrayList와 마찬가지로 동적 배열을 구현한 클래스입니다.
    내부적으로 배열을 사용하여 요소들을 저장하고 관리합니다.
  • 차이점은 synchronized 메소드 (동기화 메소드) 로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드들을 실행할 수 없고, 하나의 스레드가 메소드를 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다는 점입니다.
  • 스레드에 안전합니다. (thread safe)
  • 하지만, 요소에 접근할 때 동기화 메커니즘이 추가되어 있기 때문에 일부 상황에서는 성능이 떨어질 수 있습니다.

Map

  • 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조입니다.
  • Enrty:
    Map 인터페이스 내부에 선언된 중첩 인터페이스 입니다.
  • 키는 중복 저장 X, 값은 중복 저장 O

HashMap

// K는 키 타입, V는 값 타입
Map<K, V> map = new HashMap<K, V>();
  • Map 인터페이스를 구현한 대표적인 Map 컬렉션 입니다.

사용 예시

  • 사용자 정의 객체인 Student를 키로 하고 점수를 값으로 저장하는 HashMap 사용
  • 학번과 이름이 동일한 Student를 동등 키로 간주하기 위해 Student 클래스에서 hashCode()와 equals() 메소드 재정의 합니다.

Hashtable

Map<K, V> map = new Hashtable<K, V>();
  • HashMap과의 차이점: Hashtable은 synchronized 메소드 (동기화된 메소드)로 구성되어있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 점 입니다.
  • Hashtable은 스레드에 안전(thread safe) 합니다.

사용 예시

  • 키보드로 아이디와 비밀번호를 입력받아서, Hashtable에 저장되어 있는 키(아이디)와 값(비밀번호)을 비교한 후 로그인 여부를 출력하기
profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글