Collection Framework 이란?
Collection Framework?
데이터들을 다루는 클래스들에 대한 설계를 표준화하여 모아둔 것
Java를 공부하다보면 "Collection Framework"라는 용어를 접하게 됩니다. 위의 정의처럼 Collection Framework는 "데이터들을 다루는 클래스들에 대한 설계를 표준화하여 모아둔 것" 입니다. 자료구조 강의시간에 배우는 C++의 STL과 비슷한 것이라고 생각하셔도 됩니다. 우리가 Stack, Queue, Linked-List와 같은 자료구조를 공부할 때에는 각 자료구조를 직접 구현해서 사용합니다. 자료구조를 학습하는 측면에서 이는 분명 좋은 공부입니다. 하지만 이 맥락을 우리가 실제로 개발하는 환경 또는 빠른 시간 안에 주어진 문제를 해결해야하는 코딩테스트와 같은 환경에 가져올 수 있을까요? 불가능합니다.
간단한 자료구조 이기는 하지만, 우리가 진행하느 프로젝트 또는 응시 중인 코딩테스트에서 Stack, Queue, Linked-List가 필요한 상황이 되었다고 가정해보겠습니다. 이 상황에서 우리가 다음 자료구조를 직접 구현해서 사용한다면 다음 두 가지 큰 이슈에 직면하게 됩니다.
- 사용하는 모든 자료구조를 손수 직접 구현해서 사용하는 것... 과연 효율적일까?
- 내가 지금 구현한 자료구조가 모든 상황에 대해서 제대로 동작함을 장담할 수 있을까?
두 가지 모두 굉장히 중요한 질문입니다. 일단 직접 구현해서 사용하는 데에는 시간이 걸립니다. 예를 들어서 BFS 알고리즘을 구현하기 위해서 Queue가 필요한 데, 이 Queue 마자도 직접 구현하고 있다면 시간을 포함한 비용적 측면에서 굉장히 비효율적입니다. 또한 우리가 예상 가능한 Input의 범주 내에서는 안정적으로 동작하는 소프트웨어를 작성해야한다고 할 때, 우리가 구현한 모든 자료구조에 대해서 오류 없이 동작함을 검증하기 위해서는 굉장히 많은 수고와 비용이 필요합니다. 그렇기 때문에 우리는 다음 결론에 도달합니다.
그냥 이미 검증된, 잘 작성된 코드를 가져다 사용할게요
이러한 측면에서 java에서 등장한 것이 Collection Class 입니다. "Collection Class"는 자주 사용되는 Stack과 같은 자료형들을 java에서 쉽게 사용할 수 있도록 구현한 것입니다. Collection Framework의 개념이 등장하기 이전인 구 버전의 java에서는 Vector, Hashtable, Properties와 같은 Collection Class들이 존재했습니다. 하지만 이것들에는 문제가 있었습니다. 바로 표준화되어 있지 않다는 것입니다.
그렇다면 "설계에 대한 표준화"가 이뤄지지 않은 경우 가장 큰 문제가 무엇일까요? 사용하기가 까다롭다는 것입니다. 여기서 말하는 "설계에 대한 표준화"의 의미는 Vector, Hashtable 등과 같은 Collection Class에 대해서 데이터를 추가하거나 삭제하거나 변경하는 등의 공통된 작업들에 대해서 모두 동일한 이름의 method를 사용하도록 구성되어 있다는 것입니다. 반대로 표준화가 되어 있지 않으면 Vector에 데이터를 추가할 때 사용할 method가 다르고, Hashtable에 데이터를 추가할 때 사용하는 method가 다르기 때문에 새로운 Collection Class를 사용하고 싶다면 새로 공부해서 사용해야한다는 불편함이 따릅니다. Collection Framework의 개념이 등장하기 이전인 구 버전의 java에서는 Vector, Hashtable, Properties는 서로 설계에 대한 표준화가 되어 있지 않아서 각각 다른 방식으로 처리해야 했습니다.
하지만 Collection Framework의 개념이 등장하면서 새로운 Collection Class들의 추가와 함께 설계가 표준화 되어서 표준화된 방식으로 Collection Class들을 다룰 수 있도록 표준화가 되었습니다.
Collection Framework를 구성하는 핵심 Interface
Collection Framework를 구성하는 핵심 Interface들을 정리해보면 다음과 같습니다.
1. List
2. Set
3. Map
(실제로는 List, Set의 공통적인 부분을 모아서 Collection이라는 새로운 Interface도 만들어져 있습니다.)
실제로 Collection Framework의 모든 Collection Class들은 List, Set, Map 중 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 해당 클래스의 이름에 포함되어 있어서 어떤 Interface를 구현한 것인지 쉽게 알 수 있습니다 (ex. ArrayList).
구 버전에 존재하던 Vector, Hashtable, Properties와 같은 기존의 Collection Class 들의 경우 기존 코드와의 호환성을 고려하여 내부적인 설계만 변경되고 현재에도 유지되어 있지만, 이것들을 현 시점에서 사용하는 것은 별로 권장되지 않는다고 합니다.
위에서 언급한 List, Set, Map은 서로 가진 특성이 다릅니다. 그렇기 때문에 Collection Framework를 사용하는 개발자의 입장에서 가장 중요한 것은 각 Interface를 구현한 Collection Class의 특성과 장단점을 정확히 파악하고 자신이 개발하는 상황, 해결해야하는 문제의 종류에 따라 적절히 선택하여 사용하는 역량이 가장 중요합니다.
나중에 다시 정리하겠지만, 각 Interface들이 가지는 특성은 다음과 같습니다.
종류 | 특성 |
List | 순서가 있음, 중복을 허용함 |
Set | 순서가 없음, 중복을 허용하지 않음 |
Map | Key와 Value 쌍으로 데이터를 유지, 순서가 없으며, key는 중복X, value는 중복을 허용한다. |
앞으로 자주 사용되는 Collection Class들의 사용법과 함께 기억해둬야할 특성들에 대해서 정리해보도록 하겠습니다.
정리해보면?
1. Collection Framework는 데이터를 다루는 클래스들에 대한 설계를 표준화하여 모아둔 것
2. List, Set, Map Interface를 구현하고 있으며 각자 가진 특성이 다름
3. 모조건 좋은 것은 없으며 상황에 따라서 적절한 것을 선택해서 사용해야 함
'Web Backend > Java' 카테고리의 다른 글
콘솔 상에서 비밀번호 처리하기 (0) | 2021.08.29 |
---|---|
gson 라이브러리를 사용한 파일 입출력 기능 구현하기 (0) | 2021.07.19 |
JVM의 메모리 구조 (0) | 2021.07.03 |
Variable 과 Method (0) | 2021.06.29 |
Class와 Object (0) | 2021.06.29 |
댓글
이 글 공유하기
다른 글
-
콘솔 상에서 비밀번호 처리하기
콘솔 상에서 비밀번호 처리하기
2021.08.29 -
gson 라이브러리를 사용한 파일 입출력 기능 구현하기
gson 라이브러리를 사용한 파일 입출력 기능 구현하기
2021.07.19 -
JVM의 메모리 구조
JVM의 메모리 구조
2021.07.03 -
Variable 과 Method
Variable 과 Method
2021.06.29