본문 바로가기
Java

[Java] 배열과 컬렉션 프레임워크 정리

by Davidev 2023. 8. 24.
반응형

 

 

 

그저 Java에서 배열에 대해 알고 싶었을 뿐인데..

 

 

 

 

 

정리하게 된 이유

 

 

현재 내가 운영, 관리중인 소스에는 LinkedList, ArrayList, LinkedHashMap 등 뭔가 어려워 보이는 클래스들이 많이 등장해서 볼 때마다 정리해서 공부해야지.. 해야지.. 하고 벼르고 있던 중.. Java의 기본 배열인 "Array"를 사용하는 방법에 대해 찾아보다가 배열의 한계점을 뛰어넘는 List라는 것을 알게 되고.. List안에 ArrayList라는 것도 있고.. LinkedList라는 것도 있고... 꼬리에 꼬리를 물고 컬렉션 프레임워크까지 오게 되었다. 유튜브와 레퍼런스 문서, Chat GPT까지.. 공부하다보니 약 일주일 정도 공부한 것 같다. 

 

 


 

 

몰랐던 배경 지식에 대한 이해

 

 

'java.util.Arrays' 기본 배열인 Array가 숨어 있는 패키지이다.기본 배열을 사용할 때는 위 라이브러리를 명시적으로 import 할 필요 없이 바로 사용이 가능하다.기본 배열은 처음에 배열을 몇 칸짜리 만들건지 딱 정해서 요소를 넣고 사용한다.수정이 어려워 만든 배열을 복사해 넓은 배열을 또 만들어서 넣어주는 등의 한계가 존재했다.그래서 만들어진 팀이 '어벤저스' 가 아니라 컬렉션 프레임워크.컬렉션 프레임워크도 java.util 패키지 내부에 Array와 함께 존재한다.급은 비슷한데 기능적으로 상위 호환이기 때문에 기본 배열을 사용하지 않는 것이었다.

 

 


 

 

컬렉션 프레임워크의 종류

 

 

리스트 (List)

셋 (Set)

맵 (Map)

큐 (Queue)

 

 

위 4개를 컬렉션 프레임워크라 부르는데, 이번에 배열과 관련해 정리할 것은 리스트, 셋, 맵이다. 어쨌든 '프레임워크' 라는 네이밍이 붙어 있기 때문에.. 이 클래스들을 사용하기 위해서는 정해진 사용 규칙을 명확히 지켜서 써야만 정상 작동한다.

 

이 글에서는 요청 순서에 비례한 순차적 처리를 위한 큐는 여기서 제외하고 배열'st 3가지만 정리해 보겠다. 

 

 


 

 

리스트

 

 

리스트(List)는 기능적 측면에서 기본 배열의 상위 호환이다.

리스트의 메커니즘은 기본 배열에서 할 수 없었던 요소의 추가, 수정, 삭제를 할 수 있게 되었고, 그에 따라 배열의 길이도 자동으로 늘어나고 줄어든다는 것이다. 또 리스트는 Vector, ArrayList, LinkedList 로 세분화가 되어있지만 두려워하지 않아도 된다. 같은 java.util 내에 있는 인터페이스인 'List' 를 구현하기 때문에 셋 중 어떤 객체를 만들던 간에 동일한 메서드를 사용할 수 있다. Vector는 구형 시스템에만 존재하는 일부 코드와의 호환을 위해 남겨진 클래스라 실제 쓰이지는 않고 더 좋은 ArrayList, LinkedList로 대체해서 사용한다. ArrayList와 LinkedList의 차이점을 간단하게 정리해보자면  ArrayList의 경우 인덱스 기반의 랜덤한 엑세스 작업으로 데이터 조회 기능에 조금 더 효과적이다. LinkedList는 이름 그대로 데이터간 정보가 연결된 배열인데, 동일한 '조회 기능' 일지라도 구조상 데이터 링크를 계속 따라갔다가 와야 하기 때문에 작은 서비스라면 크게 차이가 없겠지만 규모가 큰 서비스의 경우 성능상 차이가 발생할 수 있다. 대신 데이터의 순서가 중요하고, 데이터의 삽입, 삭제 등의 수정이 빈번하다면 링크를 이용하는 LinkedList가 배열의 재배치 작업이 필요하지 않아 조금 더 효과적이라고 한다.

 

 

  조회 삽입 / 수정 / 삭제 메모리 사용량 데이터 순서 유지
ArrayList 상대적으로 빠름   상대적으로 적음 X
LinkedList   상대적으로 빠름 상대적으로 높음 O

 

 


 

 

 

셋(Set)은 단어 그대로 그냥 세트다! '선물 세트'를 떠올려보면 쉽다.

여러가지 다양한 선물을 하나씩 담아서 세트를 이루고 있는 선물세트처럼, 중복된 데이터를 제외하고 자유롭게 데이터를 담아 놓을 수 있는 인터페이스이다. 이 셋(Set)을 구현한 클래스들이 TreeSet, HashSet, LinkedHashSet 이다. TreeSet은 들어있는 데이터 요소들이 정렬된 순서로 저장되어 검색이나 순회할 때 좋다고 하지만 실제 코드에서 본 적은 없다. HashSet과 LinkedHashSet은 해시코드를 사용한(넣는 데이터마다 찾기 쉽게 번호 스티커를 붙여주는 것) 집합으로, 위에 이야기한 List에서의 차이점과 유사하다.

 

 

  조회 삽입 / 수정 / 삭제 메모리 사용량 데이터 순서 유지
TreeSet 빠름(정렬순) 빠름 상대적으로 높음 O
HashSet 빠름 빠름 상대적으로 적음 X
LinkedHashSet 빠름(순차적) 삽입, 삭제 빠름 상대적으로 높음 O

 


 

 

 

위에 비교한 리스트와 셋은 출력하면 대괄호 [값1, 값2, 값3] 안에 데이터가 들어 있는 모습이지만,

 

ex)  {키1 = 값, 키2 = 값, 키3 = 값, ...}

 

이와 같이 맵은 파이썬의 딕셔너리처럼 키와 값이 쌍을 이루는 형태의 자료 구조인 점에서 눈에 보이는 차이가 있다. 맵이라는 인터페이스를 구현한 클래스는 4가지가 있는데, 아래 표에서 특징을 천천히 살펴보면 왜 하나의 클래스가 아니라 여러가지 클래스로 나눠놓았는지 눈치 챌 수 있을 것이다. 예를 들어 데이터가 정렬되어야 하는 가치가 가장 큰 시스템에는 Sortedmap을 사용하고, 간단한 데이터만으로도 운영이 가능한 소규모 서비스는 HashMap을, HashMap보다 메모리를 좀 더 쓰더라도 데이터 삽입과 수정 등을 안정적이고 빠르게 하고 싶다면 LinkedHashMap을 선택하는 것 처럼 말이다. ('효율'을 위한 경제적 논리에 입각해 다양한 것들이 나왔다고 생각하자)

 

  조회 삽입 / 수정 / 삭제 메모리 사용량 데이터 순서 유지 정렬된 순서 유지
Hashtable 빠름 빠름 상대적으로 적음 X X
HashMap 빠름 빠름 상대적으로 적음 X X
LinkedHashMap 빠름(순차적) 빠름 상대적으로 높음 O X
SortedMap 빠름(정렬순) 빠름 상대적으로 높음 O O

 

 

 


 

 

정리

 

컬렉션 프레임워크는 '배열의 한계점'으로 부터 발생되었다.

 

이름 설명 초기화 후 길이 변경 중복 데이터 허용 요소 탐색 방식
Array 기본 배열 X O 인덱스 기반
List 기본 배열에 요소 추가, 수정, 삭제 기능이 추가된 버전 자동조절 O 인덱스 기반
Set 기본 배열과 비슷한데 중복된 데이터를 넣을 수 없게 만든 버전 자동조절 X 값 기반
Map 기본 배열에서 요소의 형태만 바꾼 버전 {key = value} 자동조절 O 키 기반

 

일단 시키는대로 하는 입장이어도 뭔지 알아야 쓰니까.. 공부하는 것이 좋고.. 주도적으로 코딩해야 하는 입장이라면, Github에서 유사한 서비스를 찾아서 뭘 쓰면 좋을지 참고하면 좋을 것 같다.

반응형

댓글