안녕하세요
앵과장입니다.
개발하면서 우리가 가장 많이 사용하고 있는 자료구조에 대해서 정리해보도록 하겠습니다.
모든언어는 데이터를 사용하는데 있어서 다양한 종류의 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형태로 합니다.
오늘은 자주사용하지만 이정도까지 알아야되나 라고 생각이 들수 있겠지만
중요한부분이기도 하고 면접관들이 자주 물어보는 빈도높은 문제이기도 합니다.
참 복잡하고 어렵지만 항상 기억해야 한다는점 잊지마세요
'프로그래밍언어 > Java' 카테고리의 다른 글
Java Functional Programming 함수형 프로그래밍으로 가기위한 용어정리 불변객체, 일급함수, 고차함수, 커링 (0) | 2022.08.12 |
---|---|
Type Boolean Integer to boolean integer 차이점 Java Wrapper형 과 Primitive형 언제 쓰면되나? (0) | 2022.05.03 |
Java 코드 컨벤션 협업을 위한 방법 (0) | 2022.01.14 |
Java 제네릭(Generic) 사용 방법과 개념 정리 (0) | 2021.12.01 |
Java 파일이 JVM에서 동작하는 원리와 메모리 영역에 대한 생각정리 (0) | 2021.11.26 |