자바 프로그램이 실행되는 동안 프로그램에서는 많은 객체들이 살고 있는 셈입니다.
일반적인 객체의 생명은 new + 생성자를 통해서 만들어진후에, 레러펀스와 결합되어
사용되다가, 가비지 컬렉터에 의해서 정리됩니다.
필요한 객체의 수가 얼마되지 않은 간단한 프로그램에는 객체가 필요할 때마다 하나씩
만들어 사용하면 그만이지만, 실제로는 객체를 모아서 관리해야 하는 경우가 생기기도 하고
또는 여러 개의 객체를 하나의 유닛 단위로 연산해야하는 경우도 생깁니다.
또 어떤 경우는 만들어진 객체를 사용하다가 잠시 저장하고, 또 다시 꺼내 쓰다가 다시
저장 하기도 합니다. 저장된 객체를 뭉치로 다른 객체의 메소드의 인자로 넘겨준다던가
하는 행동들을 해야 하는 경우가 생깁니다.
이러한 경우 객체를 저장하는 도구, 저장했다가 다시 꺼내 쓸 수 있는 도구가 필요할
텐데, 자바에서는 이 도구를 체계적으로 설계해 두었습니다.
이를 컬렉션 프레임워크(Collection Framework)라고 합니다.
컬렉션 프레임워크는 컬렉션을 쉽게 이해하고 사용하도록 폴리모피즘을 이용해서 컬렉션
객체의 메소드를 형태적으로 동일하게 유지함으로써 사용법을 일관되게 만든 아키텍쳐
입니다. 컬렉션 프레임워크는 인터페이스와 인터페이스를 구현한 실제 클래스로 철저히
분리시켜놓았으며,객체에 대한 연산,(즉 컬렉션에서 객체를 찾는 것(Search), 객체를
특정한 순서대로 정렬(Sort)하는 것), 그리고 연산을 수행하는 알고리듬(Algorithm)으로
구성됩니다.
실제로 자바에 컬렉션 프레임워크가 없다면 대부분의 일들은 배열을 가지고 프로그램
해야하는데, 배열이라는 것이 사용하기에 불편한 것이 많습니다.
자바에서는 컬렉션 프레임워크 덕분에 많은 일들을 쉽고 깔끔하게 이해하기 쉽게
처리할 수 있습니다.
컬렉션 프레임워크의 인터페이스
그림 5 - 1
그림 5 - 1은 자바의 컬렉션 프레임워크의 핵심이 되는 인터페이스들입니다.
컬렉션 프레임워크의 인터페이스 설계를 먼저 보여 드리는 이유는 컬렉션 프레임워크가
가지고 있는 형태적인 공통점을 보여주기 위해서 입니다.
고등학교 생물 교과서에 등장하는 생물들의 진화분류체계 그림에서 지구상의 생물들을
식물, 동물로 나누고, 동물을 무척추 동물, 척추동물등으로 다시 나누고, 또 척추동물
중에서는 포유류와 파충류등으로 나누는 것을 보셨을 것입니다.
그 그림을 해석할 때 척추동물분류 아래로 나타나는 생물은 모두 척추동물이고, 포유류
분류 아래로 나타나는 생물은 모두 포유류이고, 파충류 분류 아래로 나타나는 모든 생물은
파충류인 것과 같이 그림 5 - 1은 자바의 컬렉션 프레임 워크에 참여하는 인터페이스를
그림으로 나타낸 것입니다.
그림 5 - 1에 따르면 자바의 컬렉션 프레임워크는 크게 Collection 과 Map으로 나누어
집니다. 그러니까 자바의 컬렉션 프레임워크에 참여하는 클래스는 Collection 아니면 Map인
셈입니다.
즉, 컬렉션 프레임워크에 참여하는 클래스가 Collection 인터페이스를 구현 했든가 혹은
Map 인터페이스를 구현 했든가 둘 중에 하나입니다.
진화분류체계 그림에서 포유류 아래에 나타나는 모든 생물을 포유류 인 것 처럼
Collection 아래에 나타나는 모든 인터페이스,추상클래스,클래스등은 어쨋거나 Collection
입니다. 좀더 자바언어적으로 구체적인 설명은 곁들이면, Collection 아래에 나타나는 모든
인터페이스,추상클래스,클래스들은 Collection 인터페이스를 구현하거나, 상속하거나 둘
중에 하나인 셈입니다.
이런 Collection은 다시 크게 Set과 List로 구분 됩니다.
Set과 List는 객체들을 모아놓을 수 있는 능력이 있는 데이터형으로 대표적인 Collection
입니다.
Set과 List는 그 이름처럼 각각 뚜렷한 특징이 있는데, Set은 모아 놓은 객체 중에 같은
객체, 중복된 객체가 없고, List는 모아 놓은 객체들이 모두 순서를 가지고 있습니다.
예를들어 은행 창구에서 볼일을 보려고 은행창구에서 창구가 비기를 기다리는 손님들을
모아 놓았다면,손님들의 "모임"이라는 측면에서 Collection이며, 좀 더 구체적으로는 손님들
간에 대기번호표를 기준으로 "모임"에는 순서가 있으므로 List라고 할 수 있습니다.
즉, 은행 창구에서 볼일을 보려고 은행에서 창구가 비기를 기다리는 손님들은
Collection이기고하며, List이기도 합니다.
로또 당첨 번호 6개는 Collection 이면서 Set 이라고 생각할 수 있습니다.
대표적인 Collection중 하나인 Set은 모아논 객체들 간에 순서를 가지는 특별한 Set이 있는
데 이를 SortedSet 이라고 합니다. SortedSet Collection의 경우는 모아놓은 객체를 순서
대로 꺼내 읽을 수 있는 능력이 있습니다.
Set Collection의 경우는 순서라는 개념이 없으므로 모아 놓은 객체를 순서대로 꺼낼 수
있는 능력이 없습니다.
자바의 컬렉션 프레임워크의 큰 두줄기의 또 다른 하나인 Map은 Collection과는
원초적으로 다른 데이터형입니다.
Collection은 단위 객체 하나씩 모아 두는 것이고, Map은 객체의 쌍,즉 2개의 객체를
짝지어 모아 두는 곳입니다. 굳이 관계를 설정하자면 Map은 객체의 쌍, 즉 키와 값으로
이루어 져 있는데, 키는 Set으로 값은 Collection으로 이루어져 있습니다.
즉 Map은 내용적으로는 Set과 Collection이 함께 다니는 녀석입니다.
컬렉션 프레임워크의 컬렉션(Collection)
컬렉션(Collection)의 계층구조
컬렉션 프레임워크의 컬렉션(Collection)은 계층적 구조를 가지고 있습니다.
컬렉션에 참여하는 모든 객체는 Collection 입니다. 그 중 특별한 종류의 Collection을
List 혹은 Set이라고 하며,List는 모아놓은 객체들의 순서가 존재하는 Collection,
Set은 모아놓은 객체들간에 중복이 허용되지 않는 Collection입니다.
그리고 Set 중에 특별한 것을 SortedSet 이라고 합니다.
자바에서 계층적 구조를 가지는 개념을 가장 효율적으로 사용하는 설계 방법은 상속인데,
컬렉션 프레임워크는 이런 자바의 상속을 매우 잘 사용했습니다.
즉, 컬렉션 프레임워크의 컬렉션은 Collection인터페이스를 정점으로 해서, List 인터페이스와 Set 인터페이스가 Collection 인터페이스를 상속(extends) 했고, SortedSet 인터페이스
가 Set 인터페이스를 상속(extends) 했습니다.
컬렉션 프레임워크의 컬렉션은 Collection, List , Set , SortedSet 등의 인터페이스로
구성되어 있으며, 컬렉션 프레임워크에 참여하는 구체적인 클래스는 특정한 인터페이스를
구현합니다. 이렇게 공통의 인터페이스를 구현하게 되면서 자바의 컬레션 프레임워크에
참여하는 Collection 클래스들은 형태적으로 매우 유사합니다.
왜냐하면 Collection 인터페이스를 반드시 구현해야 하므로, 적어도 Collection인터페이스
에서 선언한 메소드를 모두 가지고 있기 때문입니다.
컬렉션 프레임워크가 Collection,Set,List,SortedSet,Map,SortedMap등의 인터페이스와
그 인터페이스를 구현한 실제 클래스로 구별되어 구성되어 있는 것은
폴리모피즘을 통해서 알게 됐듯이 컬렉션 프레임워크에 참여하는 모든 컬렉션 객체가
형태적으로 공통점을 가지도록 해서 사용하기 매우 편리한 것과, 컬렉션 프레임워크를
구성하고 있는 인터페이스형 레퍼런스를 가지고 다양한 클래스형의 객체를 얼마든지 사용
할 수 있습니다. 폴리모피즘을 이용한 설계에서는 인터페이스형 레퍼런스 입장에서는
실제 어떤 객체와(어떤 컬렉션) 결합되었는지는 상관이 없기 때문입니다.
이런 이유로 자바 컬렉션 프레임워크는 아주 유연합니다.
출처 : http://scarlett.tistory.com/39