본문 바로가기
Language/Java

[Java] 자바 컬렉션(Collection)이란?

by 드럼치는 코린이 2021. 9. 9.
728x90
반응형

들어가면서..

나는 Java를 배우고 학습하면서 데이터를 보관하고 사용하기 위해 Collection을 자주 사용하였다. 예를 들면 책 찾기, 수족관 키우기, 지하철, 자동차 차 탑승, 주식하기 프로그램 등등.. 그리고 팀 프로젝트를 하면서까지도.

하지만 정작 면접 시 Collection에 대해 설명해달라는 요구를 받았을 때 당황해서 제대로 답변하지 못한 것이 너무 아쉽다.
아쉬우면? 공부해서 다음에는 그 질문을 놓치지 않으면 된다. 그때의 아쉬웠던 기분을 그대로 살려서 Collection에 대해 깊이 파보는 시간을 갖도록 하겠다.


컬렉션 프레임워크(Collection Freamwork) 란?

- 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
- 즉, 데이터를 저장하는 자료 구조데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것을 말한다.

이러한 컬렉션 프레임워크는 자바의 인터페이스(Interface)를 사용하여 구현된다.

💡 여기서 잠깐! 데이터를 담고 처리하는 방법에는 배열(Array)이 있는데 왜 Collection을 사용하는 걸까?

배열과의 차이점은 정적 메모리 할당이 아닌 동적 메모리 할당을 하게 된다.
배열은 new int[4]를 하면 4개 공간밖에 못쓰고 미리 선언을 통해 4개의 공간을 만들어야 하지만(정적 메모리),
collection은 공간이 계속 필요한 만큼 추가할 수 있다(동적 메모리).


이제 Collection을 사용했을 때의 장점을 알아봤으니, 컬렉션 프레임워크의 주요 인터페이스를 알아보도록 하자.


컬렉션 프레임워크의 주요 인터페이스


자바에서의 자료구조 유형은 다음과 같다.

① 순서가 있는 목록인 List형
② 순서가 중요하지 않은 목록인 Set형
③ 먼저 들어온 것이 먼저 나가는 Queue형
④ KEY-VALUE의 형태로 저장되는 Map형

다음은 컬렉션 프레임워크의 상속 구조를 나타낸다.

이 중에서 List와 Set, Queue 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의된다.
따라서 List와 Set, Queue 인터페이스의 공통된 부분을 Collection 인터페이스에서 정의하고 있고, 
Map 인터페이스의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.


컬렉션 인터페이스의 특징


1. List 인터페이스

중복되는 데이터들을 저장해야 할 때, 배열에 들어간 순서를 유지하고 싶을 때 사용한다. (중복 o, 순서 o)

List 인터페이스는 Collection의 다른 인터페이스들과 가장 큰 차이는 배열처럼 순서가 있다는 것이다.
위 그림과 같이 List 인터페이스에서 ArrayList, LinkedList, Vector, Stack 순서로 가장 많이 사용된다.
이때 ArrayList와 Vector 클래스는 거의 동일하지만 ArrayList는 Thread safe하지 않고 Vector는 Thread safe 하다.
(Thread safe하지 않다는 것은 객체에 여러 명이 달려들어 값을 변경하려고 하면 문제가 발생할 수 있다는 것)

  • ArrayList

    - 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어나다.
    - 검색이 빠르다. 순차적으로 데이터가 추가된다면 빠르다.
    - 하지만 List들의 중간중간 데이터에 빈번한 추가 삭제가 일어난다면 느리다.
    - List 컬렉션을 여러 스레드에서 공유해야 한다면 Thread safe 하지 않다.

  • LinkedList

    - 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 좋은 성능을 발휘한다.
    - 하지만 검색이 느리다.

    - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
  • Vector

    - 과거에 대용량 처리를 위해 사용했고, 내부에서 자동으로 동기화 처리가 일어나 비교적 성능이 좋지 않고 무거워 최근에는 잘 쓰이지 않는다
    - ArrayList와 내부 구조는 동일하지만 Thread safe 하다.

2. Set 인터페이스

순서가 필요 없고, set에 저장될 데이터가 중복이 되면 안 될 때 사용한다. (중복 x, 순서 x)

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다. (단, LinkedHashSet은 순서를 보장한다.)

  • HashSet

    - 가장 빠른 임의 접근 속도
    - 순서를 예측할 수 없다.
    - Thread safe 하지 않다.


  • TreeSet

    - 정렬방법을 지정할 수 있다. (기본은 오름차순 정렬)
    - Thread safe 하지 않다.

  • LinkedHashSet

    - 입력된 순서대로 저장한다.
    - Thread safe 하지 않다.


3. Map 인터페이스

데이터를 저장할 때, key와 value 쌍으로 저장하고 싶을 때, 그리고, key를 중복 저장하고 싶지 않을 때 사용한다. (key 중복 x, value 중복 o, 순서 x)

Map은 키(Key)와 값(value)으로 이루어진 데이터 집합이다.

💡 Map의 주요 특징

- 모든 데이터는 키와 값이 존재한다.
- 키가 없이 값만 저장할 수는 없다.
- 값이 없이 키만 저장할 수도 없다.
- 키는 해당 Map에서 고유해야만 한다.
- 값은 Map에서 중복되어도 전혀 상관없다.
- 데이터 추가 순서는 중요하지 않다 (데이터를 저장한 순서대로 결과가 출력되지 않는다).

 

  • Hashtable

    - HashMap보다는 느리지만 동기화 지원
    - null불가
    - Thread safe 하다.

  • HashMap

    - 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
    - 대부분 HashMap 객체를 생성할 때에는 매개 변수가 없는 생성자를 사용한다. 하지만 HashMap에 담을 데이터의 개수가 많은 경우에는 초기 크기를 지정해주는 것을 권장한다.

    HashMap<String, String> map = new HashMap<String, String>();


  • TreeMap

    - 키와 값을 저장하는 동시에 키를 정렬한다.

    - 키(key)가 정렬되어 저장되기 때문에 검색 시 빠르다.
    - 오름차순으로 정렬되며, 정렬되는 순서는 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글 순이다.
    - 정렬을 해야 할 필요가 있다면 HashMap 보다는 TreeMap을 사용하는 것이 더 유리하다.

    TreeMap<String, String> treeMap = new TreeMap<String, String>();



마무리..

Collection은 간단하게 말하면 4가지의 자료구조를 가진 인터페이스를 가졌으며, 데이터의 형태에 따라 해당 인터페이스를 상속받아 클래스에서 표준화된 여러 메서드를 이용해 데이터를 저장하고 처리할 수 있도록 구현해 놓은 것이라고 생각할 수 있다.

이번 Collection을 공부하면서 다양한 자료구조 형태에 대해 알아볼 수 있는 좋은 시간이면서 자료구조에 대해 공부를 해야겠다는 생각을 했다. (이전에도 생각하고 있었지만,,)

자료구조를 공부해서 다양한 데이터들을 직면했을 때 좀 더 최적화된 자료구조 형태로 개발할 수 있는 개발자가 되도록 노력하자.


[ Reference ]

https://www.crocus.co.kr/1553

https://gangnam-americano.tistory.com/41

https://honbabzone.com/java/java-collection/

http://tcpschool.com/java/java_collectionFramework_concept

728x90
반응형

댓글