컴퓨터가 효율적으로 자료를 처리하기 위해서는 문제를 자료구조 측면에서 분석하고 구성하여 더 좋은 프로그램을 작성해야 한다.
즉, 프로그래머가 문제를 보다 효율적으로 해결하기 위해서는 자료구조에 대한 개념과 활용능력을 가지고 있어야 한다는 말이다.
🤔 자료구조(Data Structure)란 무엇인가?
우리는 엄청난 양의 자료 속에서 살아가고 있다. 이런 자료를 효율적으로 표현하고 저장하고 처리하여 사용할 수 있도록 하는 것이 자료구조이다.
형태에 따른 자료구조
정수, 실수, 문자, 문자열 등의 데이터 타입에 해당하는 단순구조
단순구조와 일대일 관계를 가지는 선형구조
자료간의 앞뒤 관계가 일대일로 고정되어 있는 자료구조
일대다, 다대다 관계의 비선형구조
자료 간에 선형구조가 아닌 계층(hierarchical) 구조나 망(network) 구조를 갖는 자료구조
파일구조
서로 관련 있는 필드들로 구성된 레코드의 집합인 파일에 대한 자료구조
다음에 설명할 Set(집합)이 나와있지 않는데 이것은 기타 자료구조 또는 집합 자료구조로 보고 있다.
🤔 컬렉션 프레임워크(Collections Framework)란?
- 컬렉션(Collection) - 다수의 데이터 (데이터 그룹)
- 프레임워크(Framework) - 표준화된 프로그래밍
즉, 다수의 데이터를 저장하는 클래스들을 표준화한 설계를 뜻한다.
위에서 말했던 자료구조의 기본구조라고 보면 되겠다.
🤔 Oracle(오라클) Java 8 API 공식 문서에는 어떻게 정의되어 있을까?
A collections framework is a unified architecture for representing and manipulating collections.
컬렉션 프레임워크는 컬렉션(다수의 데이터)을 표현하고 조작하기 위한 단일화된 구조(architecture)이다.
위 공식문서로 들어가면 컬렉션 프레임워크(Collections Framework)에 대해 나오는데 밑에보면 개요와 API참조, 튜토리얼 자습서, 버전마다의 API 개선사항이 있다. 그것을 참고하면 더욱 자세하게 알 수 있다.
🤔 컬렉션 프레임워크의 장점은 무엇일까?
오라클에서 제공하는 Java 8 API 공식문서 Collections Framework Overview 에서는 다음과 같다.
- Reduces programming effort by providing data structures and algorithms so you don't have to write them yourself.
- Increases performance by providing high-performance implementations of data structures and algorithms. Because the various implementations of each interface are interchangeable, programs can be tuned by switching implementations.
- Provides interoperability between unrelated APIs by establishing a common language to pass collections back and forth.
- Reduces the effort required to learn APIs by requiring you to learn multiple ad hoc collection APIs.
- Reduces the effort required to design and implement APIs by not requiring you to produce ad hoc collections APIs.
- Fosters software reuse by providing a standard interface for collections and algorithms with which to manipulate them.
💻 위 내용을 번역하면 다음과 같다.
1. 프로그래밍 작업 감소 (Reduces programming effort)
사용자가 직접 작성할 필요가 없도록 데이터 구조와 알고리즘을 제공하여 프로그래밍 작업을 줄인다.
2. 성능 향상 (Increases performance)
데이터 구조와 알고리즘의 고성능 구현을 제공하여 성능을 향상시킨다. 각 인터페이스의 다양한 구현체들은 상호 호환이 가능하기 때문에 구현체를 바꾸면서 프로그램을 조정할 수 있다.
3. 관련 없는 API 사이의 상호 운용성 제공 (Provides interoperability between unrelated APIs)
컬렉션을 주고받을 수 있는 공통 언어를 설정하여 관련없는 API 사이의 상호 운용성을 제공한다.
4. API를 배우는데 필요한 노력 감소 (Reduces the effort required to learn APIs)
다양한 임시 컬렉션 API를 학습하도록 요구하여 API 학습에 필요한 노력을 줄인다.
5. API를 설계하고 구현하는 노력 감소 (Reduces the effort required to design and implement APIs)
임시 컬렉션 API를 만들 필요가 없으므로 API를 설계하고 구현하는데 필요한 노력을 줄인다.
6. 소프트웨어 재사용 촉진 (Fosters software reuse)
컬렉션과 알고리즘을 조작할 수 있는 표준 인터페이스를 제공하여 소프트웨어 재사용을 촉진시킨다.
컬렉션 프레임워크는 왜 사용하는가?
배열의 단점을 보완하고 객체나 데이터들을 효율적으로 관리하려고 사용한다.
배열은 생성할 때 크기가 정해지고 그 크기를 넘어가면 데이터를 저장할 수 없다.
또한 데이터가 비어있으면 메모리가 낭비된다는 단점이 있다.
하지만 컬렉션은 생성할 때 특정 용량을 할당할 필요가 없으며, 데이터가 추가 및 제거될 때 자동으로 크기가 맞춰진다.
💻 컬렉션 인터페이스 (Collection Interface)
컬렉션 인터페이스는 그룹이 2개로 나뉜다.
java.util.Collection : 가장 기본적인 인터페이스
java.util.Map : 컬렉션으로 조작할 수 있는 collection-view operations을 가진다.
😠 여기서 주의할 점은 Map은 Collection이라고 보지 않는다.
The other collection interfaces are based on java.util.Map and are not true collections.
Collections Framework Overview에서는 "다른 컬렉션 인터페이스는 java.util.Map 기반으로 한다. 그리고 실제 컬렉션이 아니다." 라고 되어있다.
또한 Collections API에 대한 FAQ 에서는 다음과 같은 질문과 답변이 있다.
Why doesn't Map extend Collection?
This was by design. We feel that mappings are not collections and collections are not mappings. Thus, it makes little sense for Map to extend the Collection interface (or vice versa).
왜 Map이 Collection을 상속하지 않는가?
mappings이 collections가 아니고, collections도 mappings가 아니라고 느낀다. 그러므로 Map이 Collection interface를 상속하는 것은 말이 안된다.
(extends의 사전적 의미는 '확장'이지만 Java에서는 상속받는다라고 얘기하기 때문에 상속으로 해석하였다.)
(it makes sense 가 '말이 된다' 라는 의미인데 little을 붙여서 말이 안된다, 맞지 않다 라고 해석 했다.)
그리고 Collection Interface와 Map Interface의 호환성 문제도 있다.
List나 Set같은 컬렉션 인터페이스들은 단일 데이터를 처리하여 공통된 부분이 있다.
하지만 Map은 키(key)와 값(value)이 쌍을 이루며 처리하기 때문에 다른 형태로 컬렉션을 다룬다고 볼 수 있다.
즉, 컬렉션 프레임워크에서 컬렉션 데이터 그룹을 다루는데 필요한 기능을 가진 인터페이스는 List, Set, Queue, Map 4가지가 있다.
여기서 List, Set, Queue의 공통된 부분을 가져와서 Collection 인터페이스를 정의하였다.
그렇기 때문에 Map도 컬렉션이라고 말하기도 하지만 Java에서는 실질적으로 컬렉션이라고 보진 않는다라고 할 수 있겠다.
주요 인터페이스의 특징 요약
Map이 헷갈릴 수도 있는데 Map을 구현한 클래스에 따라서 순서가 없기도 하고, 있기도 하다.
또한 Map은 키는 중복을 허용하지 않지만 값은 중복을 허용한다.
구현 클래스에서 컬렉션 프레임워크가 생기기 전에 존재하던 Vector, Stack, HashTable 같은 클래스들은 컬렉션 프레임워크의 명명법을 따르지 않아서 보기가 힘들지만, 후에 생기는 것들은 구현한 인터페이스의 이름이 클래스 이름에 포함되어 있어서 특징을 쉽게 알 수 있도록 되어있다.
예전부터 존재하던 Vector, Stack, HashTable 같은 클래스들은 거의 사용하지 않으며, 기존 코드와의 호환을 위해 남아 있다고 보면 된다.
Vector -> ArrayList
Stack -> ArrayLIst 또는 Deque 하위 컬렉션
HashTable -> HashMap
Collection Interface (컬렉션 인터페이스)
List, Set, Queue의 조상인 Collection 인터페이스에는 다음과 같은 메서드들이 정의되어 있다.
참고
https://st-lab.tistory.com/142
https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
'프로그래밍 > Java' 카테고리의 다른 글
JVM(자바가상머신)이란? - Part 1, 소개 (0) | 2022.01.23 |
---|---|
valueOf() 와 parseInt() 의 차이점 (0) | 2022.01.21 |
Java 언박싱 형변환 (0) | 2022.01.14 |
함수형 인터페이스(Functional Interface)란 무엇인가? (0) | 2022.01.13 |
람다식이란? (0) | 2022.01.12 |