개발 이야기

컬렉션 프레임워크 본문

JAVA

컬렉션 프레임워크

개발거미 2021. 7. 11. 21:57

우리가 개발하다 보면 다수의 객체를 저장해 두고 필요할 때마다 꺼내서 사용하는 경우가 많다.

그때 사용하는 것이 배열이다.

하지만!

저장할 객체 수가 배열을 생성할 때 결정되기 때문에 불특정 다수의 객체를 저장하기에는 문제가 있다.
객체를 삭제했을 때 해당 인덱스가 비게 된다.

배열을 사용했을 때의 문제점

 

자바는 배열의 이러한 문제점을 해결하고, 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이들을 컬렉션 프레임워크라고 부른다.

 

컬렉션

  • 객체를 수집해서 저장하는 것

 

프레임워크

  • 미리 정해 놓은 라이브러리

 

컬렉션 프레임워크

바쁘신 분들을 위한 한 줄 요약!

 

List - 배열과 유사하게 인덱스로 관리

Set - 집합과 유사

Map - 키와 값의 쌍으로 관리

 

인터페이스 분류 특징 구현 클래스
Collection List - 순서를 유지하고 저장
- 중복 저장 가능
ArrayList, Vector, LinkedList
Set - 순서를 유지하지 않고 저장
- 중복 저장 안 됨
HashSet, TreeSet
Map - 키와 값의 쌍으로 저장
- 키는 중복 저장 안 됨
HashMap, Hashtable,
TreeMap, Properties

 

오늘은 컬렉션 프레임워크를 사용하는 이유, 종류, 특징을 알아보았고 나머지는 여기에 업로드하겠습니다.


List 컬렉션

  • 객체를 일렬로 늘여놓은 구조이다.
  • 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.
  • 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다.

 

1)  ArrayList

List 인터페이스를 구현한 클래스로, ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다.

위에 잠깐 설명이 나왔지만 자세히 하지면 일반 배열과 같이 인덱스로 객체를 관리한다는 점에서 유사하지만,

 

배열

  • 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없다

ArrayList

  • 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다.
  • 기본 생성자로 객체를 생성하면 10개의 객체를 저장할 수 있는 초기 용량을 가지게된다.(크기에 따라 자동 증가)
  • 처음부터 용량을 크게 잡으려면 용량의 크기를 매개값으로 받는 생성자를 이용한다.
  • 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1칸씩 당겨진다.

 

2) Vector

Vector를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출해야 한다.

List<E> list = new Vector<E>();

ArrayList와 다른 점은 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.

그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있습니다. 이것을 스레드가 안전하다라고 한다.

 

3) LinkedList

  • 인접 참조를 링크해서 체인처럼 관리하는 것이다.
  • 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.
  • ArrayList는 중간 인덱스의 객체를 제거하면 뒤의 객체는 인덱스가 1씩 앞으로 당겨진다고 했는데
  • 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 LinkedList가 더 좋은 성능을 발휘한다.
List<E> list = new LinkedList<E>();

 


 

Set 컬렉션

  • Set 컬렉션은 저장 순서가 유지되지 않는다.
  • 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.

 

동등 객체 판단

  1. 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다.
  2. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다.
  3. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면
  4. 동일한 객체로 판단하고 중복 저장을 하지 않는다.

Set 컬렉션은 구슬 주머니와 같다.

동일한 구슬을 두 개 넣을 수 없고, 들어갈(저장할) 때의 순서와 나올(찾을)때의 순서가 다를 수도 있기 때문이다.

 

1) HashSet

  • Set 인터페이스 구현 클래스로, 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.

생성방법

Set<String> set = new HashSet<String>();

 

 


 

Map 컬렉션

  • 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다.
  • 키는 중복 저장할 수 없지만 값은 중복 저장할 수 있다.

 

1) HashMap

  • 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
  • 동등 객체, 즉, 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다.

 

2) Hashtable

  • Hashtable도 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야한다.
  • HashMap과 차이점은 hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수는 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다.

생성방법

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

K - 키 타입, V - 값 타입