본문 바로가기

자바(JAVA)

Java Collection Framework

▶ Collection Framework

자바의 Collection은 많은 데이터 요소를 효율적으로 관리하기 위한 자료구조이다.

 

Java Collections Framework는 객체를 한 곳에 모아 관리하고, 편하게 사용하기 위해 제공되는 환경이다.

데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

 

▶ Collection 사용 이유

다수의 데이터를 다루는데 표준화된 클래스를 제공해준다. 그렇기에 자료구조를 직접 구현하지 않아도 된다.

 

또한 배열과 다르게 객체를 보관하기 위한 공간을 미리 설정하지 않아도 되서, 상황에 따라 객체의 수를 동적으로 정할 수 있다. 즉 요소의 개수에 따라 크기가 자동 조절되므로 프로그램의 공간적인 효율성을 높일 수 있다.

 

그 밖에 요소의 삽입, 삭제에 따른 요소의 위치를 자동으로 이동한다. 그리고 다양한 객체들의 삽입, 삭제, 검색 등 관리 측면에 있어서 용이하다.

 

 Java Collection Framework(JCF) 상속 구조

자료 구조로는 리스트, 스택, 큐, 집합 등이 있다.

Map의 경우 Collection 인터페이스를 상속받고 있지는 않지만 Collection으로 분류된다.

 

▶ List

  • 리스트는 순서가 있는 데이터의 집합이다
  • 인덱스는 몇 번째 데이터인가 정도(순서)의 의미를 갖는다.
  • 배열과 다르게 크기가 가변적이다.

대표적인 구현체로는 ArrayList와 LinkedList가 있다.

 

1) ArrayList

  • Java의 Vector를 개선한, 배열로 구현된 리스트이다.
  • 연산 부분에 있어서 수행 시간 속도는 배열와 같다. (시간 복잡도 O(1))

 

2) LinkedList

  • 다음 노드의 주소를 기억하고 있는 리스트이다.
  • 배열에 비해 삽입과 삭제가 간단하다. 그렇기에 삽입, 삭제가 빈번하게 일어나는 경우에 사용하면 용이하다.
  • 탐색의 경우 첫 번째 노드부터 탐색하기 때문에 속도가 느리다.
  • 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 사용된다.

 

▶ Map

  • HashMap, LinkedHashMap, HashTable, TreeMap이 존재한다.
  • 키(Key) - 값(Value)의 쌍으로 이루어진 데이터의 집합이다.
  • 키는 중복을 허용하지 않으나, 값은 중복을 허용한다.

 

1) HashMap

  • 키 값에 해시 함수를 적용하여 나온 인덱스에 값을 저장한다. 
  • 중복과 순서가 허용되지 않으며, 값으로 null값이 올 수 있다.
  • 시간 복잡도는 O(1) 만큼을 가진다.

2) LinkedHashMap

  • HashMap에서 입력된 순서대로 데이터를 저장하는 기능이 추가됬다. 즉 순서를 가지고 있다.

3) HashTable

  • HashMap보다 느리지만 동기화를 지원한다.
  • 키(Key) 또는 값(Value)에 null 값이 오면 컴파일 에러가 발생한다.

4) TreeMap

  • 입력된 키의 오름차순으로 데이터를 저장한다.
  • 트리 구조이기에 어느 정도 순서를 보장한다.
  • 트리 구조를 바탕으로 동작하기에 시간 복잡도는 O(log N)을 가진다.

 

▶ Set

  • HashSet, TreeSet, LinkedHashSet이 존재한다.
  • 값에 대해서 중복된 값을 저장하지 ㅇ낳는다
  • 순서를 유지하지 않는 데이터의 집합으로, 데이터의 중복을 허용하지 않는다.

1) HashSet

  • HashMap에서 키 값이 없는 자료형 집합이라고 볼 수 있다.
  • 가장 빠른 접근 속도를 가진다.

2) TreeSet

  • 정렬 방법을 지정해서 저장하는 자료 구조이다.

3) LinkedHashSet

  • 순서가 있는 Set 자료형으로, 입력한 순서대로 정렬한다.

 

▶ Generic이란?

Java의 Collection은 제네릭(Generic)을 이용한다.

 

제네릭이란 데이터 타입을 일반화한다는 의미이다.

클래스 내부에서 타입을 지정하는 것이 아닌, 클래스 외부에서 사용자에 의해 타입이 지정되는 형태를 의미한다.

 

그렇기에 다음과 같은 장점이 있다.

  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  • 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
  • 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

제네릭의 선언 예시이다.

ArrayList<String> a1 = new ArrayList<String>();
ArrayList<Integer> a2 = new ArrayList<Integer>();

 

▶ Array와 ArrayList

 자바에서는 연속된 데이터를 배열로 나타낼 때 Array 또는 ArrayList를 사용한다.

하지만 일반적인 상황에서는 ArrayList가 권장된다. 왜 ArrayList가 권장이 될까?

 

1. Array와 ArrayList의 크기

 

Array와 ArrayList의 경우 가장 큰 차이점은 배열의 크기를 조정할 수 있는가 없는가이다.

 

Array의 경우 고정 길이를 가지고 있다.

그렇기에 배열을 모두 채운 상태에서 새로운 데이터를 추가하고 싶은 경우 새로운 배열을 만들어줘야 한다.

 

반면 ArrayList의 경우 가변 길이이다.

그렇기에 새로운 데이터의 추가에 있어서 편리하며, 프로그램의 공간적인 효율성도 높일 수 있다.

 

추가적으로 가변 길이기에 리스트 뒤에 추가하는 계산(append)이 상대적으로 더 쉽다.

 

2. 제네릭의 사용 여부

 

ArrayList의 경우 제네릭을 사용한다.

 

그렇기에 클래스 외부에서 타입을 지정한다. 그래서  타입을 체크하고 변환할 필요가 없다.

 

비슷한 기능을 지원하는 경우 코드의 재사용성 또한 높아진다. 

 

이러한 이유들로 인해 프로그램 효율성 및 오류 방지 측면에 있어서 좋기에 ArrayList를 사용하는 것이 권장되는 것 같다.

'자바(JAVA)' 카테고리의 다른 글

Getter, Setter를 지양하는 이유  (1) 2023.11.01