프로그래밍언어/Java

Java Collection Framework JCF 자료구조 종류 와 특징

by 앵과장 2021. 12. 6. 07:56
반응형

안녕하세요
앵과장입니다.

개발하면서 우리가 가장 많이 사용하고 있는 자료구조에 대해서 정리해보도록 하겠습니다.

모든언어는 데이터를 사용하는데 있어서 다양한 종류의 Collection을 제공 합니다.
데이터를 조회하고 등록 수정 삭제 를 넘어서 가공하거나 통계 집계를 내거나 Join을 하고 타입을 변환도 하면서 말입니다.

매번 데이터를 가공하는데 처음부터 구현하기란 참 쉬운게 아닙니다.
언어에서 제공하는 라이브러리를 이해하고 필요한곳에 사용하는 방법에 대해서 알아보도록 하겠습니다.

 

컬렉션
Java Collection Framework


Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 
JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렌션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공합니다.

 

자료구조 유형

 

https://falkhausen.de/Java-8/java.util/Collection-List.html

List

- 순서가 있는 목록인 List형

List Interface 대표적인 메소드

Method Return Type Details
add(E e) boolean 요소추가
remove(Object o) boolean 전달받은 객체를 삭제함
contains(Object o) boolean 전달받은 객체가 컬렉션에 존재하는지 확인후 유무 확인후 true, false 반환합니다.
size int 현재 컬렉션 요소 개수를 반환합니다.
get(int index) E 전달받은 index에 원소를 반환합니다.
set(int index, E elements) E 지정된 위치에 요소를 지정된 요소로 변경합니다.
isEmpty() boolean 현재 컬렉션 요소가 없다면 true
존재한다면 false
equals(Object o) boolean 지정된 객체와 같은지 비교
indexOf(Object o) int 지정된 객체가 있는 첫번째 요소 위치를 반환합니다.
없다면 -1을 반환합니다.
clear() void 모든 요소를 제거합니다.
ArrayList

List 인터페이스를 상속받은 가변적 선형 리스트입니다.

최초 배열에 생성크기는 정해져 있으며

기본적으로 10의 저장용량을 갖는다고 합니다.

추가적인 add가 발생하게되면 자동으로 1.5배수로 증가하게 됩니다.

 

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

 

Vector

Thread safe 로 인한 동기화 보장

하나의 스레드 자원을 이용하기때문에 성능에 저하 발생

공간이 확장할때 2배 확장하여 메모리 사용에 대한 단점 발생 

멀티Thread환경에서는 안정적으로 사용가능하며

단일 Thread 에서는 ArrayList가 성능적으로 우세합니다.

 

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

 

LinkedList

ArrayList 와 Vector는 인덱스로 데이터를 관리하지만

LinkedList는 인접한 곳을 링크하여 체인처럼 관리한다고합니다.

LinkedList는 중간의 데이터를 삭제할때 인접한 곳의 링크만을 변경하면 되기 때문에 

중간에 데이터를 추가/삭제 하는경우 처리속도가 빠르다고합니다.

 

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

 

 

Set

- 순서가 중요하지 않은 목록인 Set형

Queue

- 먼저 들어온 것이 먼저 나가는 Queue형

Map

 

- KEY-VALUE의 형태로 저장되는 Map형

HashMap은 Map 인터페이스에 속해있는 컬렉션 입니다.
데이터들은 모두 Key 와Value 형태 구조로 되어있는 Entry 로 되어있습니다.

 

key는 고유한 속성이지만 Value는 고유한 속성이 아닙니다.

중복되는 key정보가 오면 Value는 마지막에 값으로 변경됩니다.

Key에 대한 충돌이 발생할경우 Value를 유지하기위해서는 

 

Value에 구조를 List로 변경해야합니다.

우리는 이부분을 hash충돌을 벗어나는 방법에서 설명하곤합니다.

 

Big O표기법으로 표현할때 O(1)으로 표기할수 있으며 

Value가 충돌이 발생하여 List로 변경되면 O(N) 으로 표현됩니다.

 

HashMap을 왜 써야하는지 물어보는 경우가 있는데

자료구조에서 O(1)이라는 성능으로 사용이 가능하며 Key와 value형태로 

많은 부분들에 비지니스로직을 처리하곤 합니다.

Json 형태도 key:value형태이고

Redis에서 제공하는 자료구조에 key:value형태로 주로 사용하곤합니다.

Queue 처리할때도 key:value형태로 합니다.

 

오늘은 자주사용하지만 이정도까지 알아야되나 라고 생각이 들수 있겠지만

중요한부분이기도 하고 면접관들이 자주 물어보는 빈도높은 문제이기도 합니다.

 

참 복잡하고 어렵지만 항상 기억해야 한다는점 잊지마세요