핵심 자료구조 (Array, List, Map)
배열(Array)
배열은 가장 전통적이고 기본이 되는 자료구조이다. 데이터를 순차적으로 저장해 0부터 시작하는 인덱스를 통해 접근한다.
Array 특징
- 일반적으로 배열은 선언할때 크기 고정
- 데이터를 임의 접근할 수 있어 탐색을 효율적으로 할 수 있음
- 배열에 들어가는 데이터는 모두 동일한 자료형 이어야 함
- 배열 중간에 값을 추가하려면 기존 데이터를 모두 이동시켜야 함
리스트(List)
배열과 유사한 순차적인 자료구조를 제공한다. 데이터 접근을 위해 인덱스를 사용해야 하는 점은 배열과 같지만 배열의 모든 단점을 커버한다.
List 특징
- 데이터 크기가 고정되지 않음
- 데이터를 다루기 위한 여러 방법이 제공됨
- 리스트의 데이터는 서로 다른 타입일 수 있음 -> 일관된 처리가 어려워 보통은 동일하게 처리함
- 배열 중간에 값을 추가하거나 삭제하기 쉬움
- 특정 데이터가 포함되어 있는지 확인은 가능하나 검색을 위해서는 별도 구현이 필요
맵(Map)
데이터를 Key:Value(키:값)의 쌍으로 저장하는 방식이다. 실제 데이터가 저장되는 형태는 내부구조에 따르며 사용하는 쪽에서는 내부구조에 대해 신경쓸 필요가 없는 형태이다. 맵을 사용했을때 얻을 수 있는 가장 큰 장점은 원하는 데이터를 손쉽게 찾을 수 있다는 점이다.
Map 특징
- 데이터를 저장할 때 해당 데이터를 찾기 위한 Key를 부여
- Key값을 알면 언제든 쉽게 데이터를 찾을 수 있음
- Value 에 객체형이 들어갈 수 있어 복잡한 데이터 처리가 가능
자바 컬렉션 프레임워크(JCF)
JAVA에서는 다양한 자료구조가 JCF (Java Collection Framework)라는 프레임워크로 제공된다. 컬렉션 프레임워크는 데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다.
JCF는 Collection, Map, List, Set 인터페이스를 중심으로 다음과 같은 클래스 계층구조를 형성하여 이를 통해 기본 자료구조 클래스들이 구성되어있다.
JCF 핵심 인터페이스 비교
인터페이스 | 설명 | 특징 | 대표 구현 클래스 |
List | 순서가 있는 데이터의 집합. | 데이터의 중복을 허용 | ArrayList, LinkedList, Stack |
Set | 순서를 유지하지 않는 데이터의 집합. | 데이터의 중복을 허용하지 않음 | HashSet, LinkedHashSet, TreeSet |
Map | 키(key)와 값(value)의 쌍으로 이루어진 데이터 집합. | 순서 유지 X, 키 중복 X, 값 중복 O | HashMap, TreeMap, LinkedHashMap, Properties |
☛ LinkedList는 현재 데이터에 다음 데이터를 읽을 수 있는 정보를 추가한 것으로 불연속적으로 존재하는 데이터를 서로 연결할 수 있는 방법을 제공한다.
☛ Double LinkedList는 이전과 다음 데이터 정보를 모두 가지고 있는 형태이며 자바의 경우 LinkedList 클래스가 제공되는데 실제로는 Double Circular LinkedList(순환구조가 추가된 Double Linked List) 형태를 구현해 둔 것이다.
컬렉션 객체 생성 방법
모든 컬렉션 클래스들은 java.util 패키지에 들어있다. 컬렉션 객체를 생성하는 방법은 참조변수 선언시 상위 인터페이스 타입을 사용하고 객체 생성은 필요에 따라 구체적인 클래스들을 사용하는 형식이다.
ArrayList<String> list = new ArrayList<>(); // 권장안됨
List<String> list = new ArrayList<>(); // 권장됨
컬렉션 클래스 정리
컬렉션 | 특징 |
ArrayList | 배열기반, 데이터의 추가와 삭제에 불리, 순차적인 추가삭제는 제일 빠름. 임의의 요소에 대한 접근성(accessibility)이 뛰어남. |
LinkedList | 연결기반. 데이터의 추가와 삭제에 유리. 임이의 요소에 대한 접근성이 좋지 않다. |
HashMap | 배열과 연결이 결합된 형태. 추가, 삭제, 검색, 접근성이 모두 뛰어남. 검색에는 최고성능을 보인다. |
TreeMap | 연결기반. 정렬과 검색(특히 범위검색)에 적합. 검색성능은 HashMap보다 떨어짐. |
Stack | Vector를 상속받아 구현 |
Queue | LinkedList가 Queue 인터페이스를 구현 |
Properties | Hashtable을 상속받아 구현 |
HashSet | HashMap을 이용해서 구현 |
TreeSet | TreeMap을 이용해서 구현 |
LinkedHashMap LinkedHashSet |
HashMap과 HashSet에 저장순서유지기능을 추가 |
참고
자바의 정석 3rd Edition
'Dot Programming > Java' 카테고리의 다른 글
[Java] 메서드 오버라이딩과 하이딩에 대해 (Overriding and Hiding Methods) (0) | 2022.01.31 |
---|---|
[Java] 추상 클래스 vs 인터페이스 (추상 클래스와 인터페이스의 차이는 결합력) (0) | 2022.01.31 |
2022년 자바 개발자 로드맵 (The 2022 Java Programmer RoadMap) (0) | 2022.01.17 |
[Java] 자바가 언제나 Call By Value인 이유 (Call By Reference X) (0) | 2021.09.29 |
[Java] API 호출 및 JSON Parsing 하기 (JSONObject, JSONArray, JSONParser) (0) | 2021.09.22 |