컬렉션 프레임워크
컬렉션 프레임워크에 대한 이해
프레임워크란?
- 프로그램 설계 구조와 규칙을 제공하는 일종의 체계를 의미
- 즉, 개발자들에게 어떻게 코드를 구조화하고, 어떤 규칙을 따라야 하는지에 대한 지침을 제공하는 것.
- 프레임워크는 일반적인 문제를 해결하기 위한 코드나 구조를 제공하여, 개발자는 이미 만들어진 기능을 재사용 할 수 있다.
- 일반적으로 프레임워크는 확장 가능한 구조로 설계되어 있어, 필요에 따라 기능을 추가하거나 변경이 가능함.
컬렉션 프레임워크란?
- 데이터를 저장, 관리 및 처리하기 위한 다양한 "자료 구조"와 "메서드"를 제공하는 라이브러리의 집합.
- 즉, 자료 구조와 메서드를 제공함으로써 데이터를 보다 효율적으로 다루고 처리하는 데 도움을 주는 도구.
- 데이터를 다루는 데 필요한 여러 인터페이스와 그 인터페이스를 구현한 클래스들로 구성
JDK1.2 컬렉션 프레임워크의 도입
JDK 1.2 이전에는 다양한 데이터를 저장하고 다루는 클래스들이 서로 다른 인터페이스와 메서드를 가지고 있어서 데이터 처리가 복잡하고 일관성이 없는 문제가 있었다.
이로 인해 개발자들은 다양한 데이터 구조를 사용할 때마다 그에 따른 다른 방식을 익혀야 했으며, 코드 재사용성과 유지보수에 어려움을 겪었다.
JDK 1.2에서 도입된 컬렉션 프레임워크(Collection Framework)는 이러한 문제를 해결하고자 등장했다. 컬렉션 프레임워크는 다양한 종류의 데이터를 저장하고 관리하는 클래스들을 일관된 인터페이스와 메서드로 표준화하여 제공함으로써 데이터 처리를 훨씬 간편하고 일관된 방식으로 할 수 있게 만들었다.
컬렉션 프레임워크의 도입으로 인한 변화
1. 일관성 있는 인터페이스
- List, Set, Map과 같은 다양한 데이터 구조를 다루는데 사용되는 인터페이스들이 표준화되었다. 이로써 개발자들은 각 데이터 구조마다 다른 메서드를 학습하지 않고, 일관성 있는 방식으로 데이터를 다룰 수 있다.
2. 코드 재사용과 유지보수의 향상
- 컬렉션 프레임워크를 사용하면 표준화된 인터페이스를 통해 다양한 컬렉션 클래스를 손쉽게 교체하거나 추가할 수 있다. 이로써 코드의 재사용성과 유지보수가 크게 향상되었다.
3. 효율적인 알고리즘 활용
- 컬렉션 프레임워크는 다양한 데이터 구조를 효율적으로 다루기 위한 알고리즘과 메서드들을 제공한다. 이로써 프로그래머들은 데이터를 보다 효율적으로 처리할 수 있다.
4. 커스터마이징 가능
- 컬렉션 프레임워크는 인터페이스를 구현하는 방식으로 클래스를 작성하므로, 개발자는 필요에 따라 자신만의 데이터 구조를 만들어서 사용할 수 있다.
*참고* 컬렉션 클래스는 컬렉션이라는 이름을 가진 클래스가 아닌 컬렉션 프레임워크에서 제공하는 인터페이스를 구현한 클래스들을 총칭하는 말이다.
컬렉션 프레임워크의 핵심 인터페이스간의 상속 계층도
*참고* 위 그림에서 Collection은 Collection프레임워크나 Collection클래스를 표현하는 것이 아닌 "Collection 인터페이스"의 상속 계층도를 보여주는 그림이다.
컬렉션 프레임워크의 3가지 핵심 인터페이스에는 List, Set, Map이 있다.
- List, Set, Map 인터페이스는 각각 다양한 방식으로 데이터를 저장하고 다룰 수 있는 다양한 자료 구조를 나타낸다.
인터페이스 List와 Set을 구현한 컬렉션 클래스들은 많은 공통부분이 있어서 공통된 부분을 다시 뽑아 'Collection 인터페이스' 를 정의하였지만, Map인터페이스는 이들과는 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에는 포함되지 못했다.
이러한 설계는 객체지향언어의 장점을 극명히 보여주는 것이라고 말할 수 있다. (공통된 기능을 재사용하고 일관성 있게 구현함)
인터페이스 | 특징 |
List |
|
Set |
|
Map |
|
개발 시에는 다루고자 하는 데이터 집합의 특징에 따라,
컬렉션 프레임워크의 어떤 인터페이스(List, Set, Map)를 구현한 클래스를 사용해야하는지 결정이 필요하므로 특징과 차이점에 대해 잘 이해를 해야한다.
컬렉션 프레임워크의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 포함되있어서(ArrayList 클래스(List 인터페이스 구현), HashSet(Set 인터페이스 구현)) 이름만으로도 클래스의 특징을 쉽게 알 수 있도록 되어있다.
그러나, Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임워크 도입 전에 존재했던 구조이므로, 컬렉션 프레임워크의 명명법을 따르지않는다.
즉, 컬렉션 클래스의 이름에 인터페이스의 이름이 포함되지 않은 클래스들은 JDK1.2 이전이라고 생각하면 좋을 것 같다.
컬렉션과 배열의 차이?
배열은 동일한 타입의 요소를 순서대로 저장하고 크기가 불변적이므로, 크기를 변경하는 데에 있어서 제약이 있다. (생성과 동시에 크기를 지정해주어야 한다.)
반면에, 컬렉션은 서로 다른 유형의 타입을 저장할 수 있으며, 크기가 가변적이므로 요소를 추가하고 제거에 유연하다.
또한 메모리에 연속적으로 데이터를 저장하는 배열과는 달리, 컬렉션에는 데이터를 다룰 수 있는 다양한 종류의 데이터 구조가 있으며, 각각의 컬렉션에는 다양한 데이터 조작 기능과 메모리 관리 방법을 제공한다.
즉, 요소 추가, 제거, 검색 정렬 등 일반적으로 배열보다 더 많은 기능을 제공하여 데이터 관리를 보다 쉽게 수행할 수 있도록 도와준다.
배열을 쓰는 이유
배열은 메모리 상에 연속된 공간을 차지하며, 인덱스를 통해 요소에 직접 접근할 수 있으므로, 일반적으로 컬렉션보다 접근 속도가 빠르다.
반면에 컬렉션은 배열보다 다양한 데이터 조작 기능과 유연성을 제공하기 위해 보다 복잡한 내부 구조를 가지며, 배열과 달리 각 요소가 메모리 상에서 분산되어 저장될 수 있다. (List 인터페이스를 구현한 ArrayList는 내부적으로 배열을 사용하지만, 추가적인 메서드 호출 및 크기 관리를 수행해야 하므로, 배열보다 느리다.)
그러나, 최신 컴퓨터 하드웨어와 프로그래밍 언어의 최적화 기술의 발전으로 접근 속도의 차이는 미미하다고 한다.
요약하자면, 데이터 집합이 단일 데이터 타입이고, 데이터 크기가 고정적이며 변경될 가능성이 적을 때 빠른 접근을 위해 배열을 사용하는 것이 유리하다.
데이터 구조 | 크기 | 데이터 타입 |
배열 | 크기가 고정적 | 단일 |
컬렉션 | 크기가 가변적 | 복수 |