[JAVA] Collection 프레임워크(List, Set, Map)

Dayeon myeong·2021년 2월 2일
0

[JAVA]자바 기초

목록 보기
1/3

컬렉션 프레임워크

다수의 객체(데이터)를 다루기 위해 표준화된 클래스들을 제공해주는 프레임워크로 자료구조를 직접 구현하지 않고 편하게 사용가능하다. 또한, 객체를 보관하기 위한 공간을 정하지 않고 동적으로 할 수 있어서 공간적 효율성 또한 높다.

프레임 워크 : 제어의 역전 개념을 가져 애플리케이션을 주도하며 사용자에게 편리한 인터페이스, 클래스들을 제공해주는 틀

컬렉션 프레임워크의 핵심 인터페이스 - List, Set, Map

List (순서를 가지고, 중복된 데이터 가능)

  • 배열 또는 연결리스트 자료구조와 동일한 구조
  • 기존 배열과 연결리스트를 편하게 사용할 수 있도록 클래스가 구성되어 있다.
  • Vector : ArrayList의 구버전, ArrayList와 동일하나 동기화 처리가 가능하다는 차이가 있다. 따라서 멀티스레드 환경에서 동시에 vector를 사용할 수 없고 하나의 스레드가 실행을 완료해야만 다른 스레드가 실행 할 수 있다. (멀티스레드 환경에 안전, thread safe)
  • ArrayList : 일반 배열을 다루는 클래스, 동기화 처리가 불가능, 인덱스 기반 접근속도(읽기) 빠름, 크기 변경이 불가능, 데이터 삽입 삭제시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야 되는 단점이 있음
  • LinkedList : 연결리스트 자료구조 구현 , 현재 위치의 이전/다음 위치를 가지고 있어 삽입 삭제 좋음, 크기는 가변적, 링크를 쭉 따라가야 접근이 가능해서 읽기 느림

데이터 검색 : ArrayList
삽입/삭제 : LinkedList

Set (순서를 가지지 않고, 중복된 데이터 불가능)

  • 값을 해싱해서 저장하거나 이진 트리 구조를 이용해서 데이터 처리 속도를 높임
  • 컬렉션 프레임워크 중 가장 빠른 검색 속도를 가짐
  • HashSet : 값을 해싱 기법으로 저장, 탐색하여 중복을 피하고 속도를 높임
    • HashMap과 유사하지만 별도의 키 값 없이 데이터 자체를 해싱하여 카테고리화 하여 저장
    • → 메모리 사용이 적고 해싱 기법을 사용하여 컬렉션 프레임워크 중 가장 빠른 데이터 처리 속도, 검색 속도를 가짐
  • TreeSet : TreeMap과 같이 이진 트리를 이용해 정렬하면서 저장하여 검색 속도를 높임 , 해싱기법을 사용한 hashset에 비해서는 상대적으로 속도가 떨어짐

Map (순서를 가지지 않고, 중복된 데이터는 value만 가능)

  • 데이터를 키(key)와 값(value)로 구분하여 구성
  • 인덱스 대신 키값을 효율적인 방식으로 검색하여 검색 속도를 높임
  • 키는 인덱스의 기능이기 때문에 중복될 수 없음 (값은 중복 가능)
  • 데이터 입력 시 동일한 키를 사용하면 값을 덮어씀
  • hashTable : hashMap의 구버전, 동기화 처리가 가능 (멀티스레드 환경에서 안전)
  • hashMap : 키값을 해싱(hashing)해서 검색 속도를 높임,동기화 처리 불가능
  • TreeMap : 자료를 이진 트리 구조로 정렬하면서 저장해서 검색 속도를 높임

HashTable, HashSet, HashMap과 같은 컬렉션에서는 자료를 저장하기 위한 위치를 선택할 때 hashCode() 메서드를 사용한다.
그런데 만약 두 개의 객체가 같은 값을 가진다고 equals() 메서드로 오버라이딩해주어도, hashCode() 메서드는 주소를 비교하기 때문에 다른 객체라고 인식해서 서로 다른 위치에 저장이 된다.
따라서 equals() 메서드를 오버라이드해서 두 객체의 값이 같다고 했을 경우 hashCode() 메서드도 오버라이딩 해줘야 한다.

추가적으로, 컬렉션 프레임워크는 Object 타입의 객체만을 저장한다. 그래서 기본형(원시형, primitive type) 데이터는 데이터 저장시 직접 boxing해주어서 wrapper 클래스로 변환해주어야 한다.
ex) Integer n = new Integer(5)와 같이 wrapper 클래스의 Integer 타입 객체로 변환해야함

그런데 실제로는 이러한 과정을 거치지 않아도 컴파일러가 자동으로 autoboxing을 해주어서 wrapper 클래스로 변환해준다.
저장된 값을 얻어오거나 지우거나 등 컬렉션 메서드를 사용할 때에도 객체화된 데이터를 기본형으로 바로 얻어올 수 있는데 이러한 경우 unboxing이라 한다.
ex) 숫자 1을 이용한 컬렉션 메서드 이용 collection.remove(1), collection.remove(new Integer(1))

profile
부족함을 당당히 마주하는 용기

0개의 댓글