반응형
1. 컬렉션 프레임워크( Collection Framework )
- 컬렉션 프레임워크란 '데이터 군을 저장하는 클래스들을 표준화한 설계'를 뜻한다.
- 컬렉션은 다수의 데이터, 즉 데이터그룹을 의미하고 프레임워크는 표준화된 프로그래밍 방식을 의미한다.
- 컬렉션 프레임워크는 컬렉션, 다수의 데이터를 다루는 데에 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어주고 있으며, 또한 인터페이스의 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다.
- 컬렉션 프레임워크의 핵심 인터페이스
- 컬렉션 프레임워크는 컬렉션 데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는 데 필요한 기능을 가진 3개의 인터페이스를 정의하였다.
- 인터페이스 List와 Set의 공통된 부분을 뽑아 새로운 인터페이스인 Collection 인터페이스가 추가로 정의되었다.
- 인터페이스 List와 Set을 구현한 컬렉션 클래스들은 서로 많은 공통부분이 있어서 공통된 부분을 다시 뽑아 Collection 인터페이스로 정의할 수 있었지만 Map 인터페이스는 이들과 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에 포함되지 못했다.
인터페이스 특징 List 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
구현 클래스 : ArrayList, LinkedList, Stack, ( Vector )Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 허용 불가
구현 클래스 : HashSet, TreeSetMap 키( key )와 값( value )의 쌍으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복을 허용한다.
구현 클래스 : HashMap, ( TreeMap, HashTable, Properties... ) - 실제 개발시에는 다루고자 하는 컬렉션의 특징을 파악하고 어떤 인터페이스를 구현한 컬렉션 클래스를 사용해야 하는지 결정해야 하므로 위의 인터페이스의 특징과 차이를 이해하고 있어야 한다.
- 컬렉션 프레임워크의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 클래스의 이름에 포함되어 있어서 이름만으로도 클래스들의 특징을 쉽게 알 수 있도록 되어있다.
- 컬렉션 사용시 주의할 점
컬렉션에서는 값들이 일치한지 비교할 때 그 요소 타입의 equals()나 hashCode()로 비교를 하기 때문에 우리가 만든 클래스에서 저 둘을 재정의하지 않는다면 주소값 비교로 같은 요소를 찾을 수 없게 된다. 따라서 비교하고자 하는 요소를 올바르게 비교하도록 우리가 만든 클래스에서 equals()와 hashCode()를 재정의 해서 사용한다. - Collection Interface
- List와 Set의 조상인 Collection 인터페이스에는 다음과 같은 메소드들이 정의되어 있다.
Collection 인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메소드들을 정의하고 있다.
- List와 Set의 조상인 Collection 인터페이스에는 다음과 같은 메소드들이 정의되어 있다.
- List Interface
- List 인터페이스는 중복을 허용하면서 저장 순서가 유지되는 컬렉션을 구현하는데 사용한다.
- Set Interface
- Set 인터페이스는 중복을 허용하지 않고 저장 순서가 유지되지 않는 컬렉션 클래스를 구현하는 데 사용한다.
- Map Interface
- Map 인터페이스는 키( key ), 값( value )을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용한다.
- 키는 중복할 수 없지만, 값은 중복을 허용한다.
- 기존에 저장된 데이터에 중복된 키와 값을 저장하면 기존의 값은 없어져도 마지막에 저장된 값만 남게된다.
2. List Interface
- ArrayList
ArrayList는 컬렉션 프레임워크에서 가장 많이 사용하는 컬렉션 클래스일 것이다.- 이 ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고, 중복을 허용한다는 특징이 있다.
- ArrayList는 기존의 Vector 클래스를 개선한 것으로 Vector의 구현원리와 기능적인 측면에서 동일하다고 할 수 있다.
- ArrayList는 Object 배열을 이용해서 데이터를 순차적으로 저장한다.
- 만약 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장한다.
- 배열은 가장 기본적인 형태의 자료구조로 구조가 단단하며 사용하기 쉽고 데이터를 읽어오는 데 걸리는 시간( 접근 시간 : access time )이 가장 빠르다는 장점을 가지고 있지만, 다음과 같은 단점을 가지고 있다.
- 크기를 변경할 수 없다.
- 크기를 변경할 수 없으므로 새로운 배열을 생성해서 복사해야 한다.
- 실행 속도를 향상하기 위해 충분히 큰 배열을 생성할 순 있으나 메모리의 낭비가 발생한다. - 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.
- 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 건 빠르다.
- 단, 배열의 중간에 데이터를 추가 혹은 삭제하려면 빈자리를 만들기 위해서 데이터들을 복사해서 이동해야 한다.
- 크기를 변경할 수 없다.
- LinkedList
- 위와 같은 배열의 단점을 보완하기 위해 LinkedList라는 자료구조가 고안되었다.
- 배열은 모든 데이터가 연속적으로 존재하지만 LinkedList는 불연속적으로 존재하는 데이터들을 서로 연결한 상태로 구성되어 있다.
- LinkedList에서의 데이터 삭제는 간단하다.
삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다.
==> 배열처럼 데이터를 이동하는 복사 과정이 없기 때문에 처리속도가 굉장히 빠르다.
- LinkedList 역시 List 인터페이스를 구현했기 때문에 ArrayList와 내부 구현 방법만 다를 뿐 메소드의 종류와 기능은 거의 같다.
ArrayList VS LinkedList
컬렉션 읽기( 접근시간 ) 추가 / 삭제 비고 ArrayList 빠르다 느리다 순차적인 추가 삭제는 빠르다. 비효율적인 메모리 사용 LinkedList 느리다 빠르다 데이터가 많으면 많을수록 접근성이 떨어진다. - 다루고자 하는 데이터의 개수가 변하지 않는 경우라면 ArrayList가 최상의 선택이 되겠지만, 데이터의 변경이 잦다면 LinkedList를 사용하는 것이 더 나은 선택이 될 것이다.
- 두 클래스의 장점을 이용해서 두 클래스를 조합해서 사용하는 방법도 생각해 볼 수 있다.
- 처음에 작업하기 전에 데이터를 저장할 때는 ArrayList를 사용한 다음, 작업할 때는 LinkedList로 데이터를 옮겨서 작업하면 좋은 효율을 얻을 수 있을 것이다.
- 스택과 큐( Stack & Queue )
- Stack은 마지막에 저장된 데이터를 가장 먼저 꺼내게 되는 LIFO( Last In First Out ) 구조로 되어있고, Queue는 처음에 저장된 데이터를 가장 먼저 꺼내는 FIFO( First In First Out ) 구조로 되어있다.
- Stack을 구현할 땐 ArrayList와 같은 배열 기반의 컬렉션 클래스가 적합하지만, Queue는 데이터를 꺼낼 때 항상 첫 번째 데이터를 삭제하므로 LinkedList로 구현하는 것이 좋다.
Stack Ex) 수식 괄호 검사, 웹브라우저의 뒤로/앞으로 가기 등 Queue Ex) 최근 사용 문서, 인쇄 작업 대기목록 등
3. Enumeration, lterator, Listlterator
- Enumeration, lterator, Listlterator은 모두 컬렉션 클래스에 저장된 데이터를 접근하는 데 사용되는 인터페이스이다.
- Enumeration는 lterator의 구버전이며 lterator의 접근성을 향상한 것이 Listlterator이다.
- Iterator
- 컬렉션 프레임워크에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.
- 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 lterator 인터페이스를 정의하고 Collection 인터페이스에는 'iterator( Iterator를 구현한 클래스의 인스턴스 )'를 반환하는 메소드 iterator()를 정의하고 있다.
- 그래서 List나 Set 인터페이스를 구현하는 컬렉션을 iterator()가 각 컬렉션의 특징에 맞게 작성되어 있다.
- Iterator에서 읽을 때 처음에 커서가 만들어져서 한쪽 방향으로 쭉 가면서 읽는다. 그러다가 마지막에 도착하면 종료한다.
- List는 get이라는 것이 있지만 Set은 요소를 접근하는 방법이 없다. 그래서 표준화를 시켜서 읽어온다.
- Listlterator와 Enumeration
- Enumeration은 컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이라고 할 수 있다.
- 이전 버전으로 작성된 소스와의 호환을 위해 남겨두고 있을 뿐이므로 가능하면 Iterator를 사용하는 것이 좋다.
- ListIterator는 Iterator를 상속받아서 기능을 추가한 것으로 컬렉션의 요소에 접근할 때 Iterator는 단방향으로만 이동할 수 있는 데에 반해, ListIterator는 양방향으로의 이동이 가능하다.
- 다만 ArrayList와 LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용이 가능하다.
- Iterator에서 읽을 때 처음에 커서가 만들어져서 한쪽 방향으로 쭉 가면서 읽는다. 그러다가 마지막에 도착하면 종료한다.
- ListIterator는 한쪽 방향으로 갔다가 역방향으로도 읽을 수 있다.
반응형
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] 제네릭스( generics ) (0) | 2022.02.07 |
---|---|
[JAVA] 컬렉션 프레임워크( Collection Framework ) - Arrays, Comparable & Comparator, HashSet, TreeSet, HashMap & HashTable (0) | 2022.02.04 |
[JAVA] Object, String, Math, Wrapper 클래스 (0) | 2022.01.29 |
[JAVA] 예외처리( exception handing ) (0) | 2022.01.28 |
[JAVA] 내부클래스( inner class ), 익명클래스( anonymous class ) (0) | 2022.01.27 |