230801 Collection
Write Once, Run Anywhere
자바 최초 등장 당시의 모토
목차
1. 컬렉션이란?
2. 배열과의 비교
3. 제네릭
4. 주요 인터페이스
- 컬렉션이란?
데이터의 집합과 그룹을 의미한다. 메모리상에서 자료를 구조적으로 처리하는 방법이기도 한데, 자료구조를 담당하는 프레임워크이며, 자료의 추가, 삭제, 정렬 등의 기능처리가 간단하게 해결 되어 자료구조적 알고리즘을 구현할 필요 없다.
2. 배열과의 비교
1) 배열의 단점
1. 한 번 크기를 지정하면 변경할 수 없다.
- 공간 크기가 부족하면 에러가 발생 -> 할당 시 넉넉한 크기로 할당하게 됨 (메모리 낭비)
- 필요에 따라 공간을 늘리거나 줄일 수 없다.
2. 배열에 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
- 추가, 삭제할 데이터부터 마지막 기록된 데이터까지 하나씩 뒤로 밀어내고 추가해야 함 (복잡한 알고리즘)
3. 한 타입의 데이터만 저장 가능하다.
2) 컬렉션의 장점
1. 저장하는 크기의 제약이 없다.
2. 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다.
- 자료를 구조적으로 처리 하는 자료구조가 내장되어 있어 알고리즘 구현이 필요 없음
3. 여러 타입의 데이터가 저장 가능하다.
- 객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을 저장해야 하는 경우 Wrapper클래스를 사용한다.
어떠한 타입을 선언해주어 해당 컬렉션이 사용할 데이터의 타입을 고정시켜놓는 개념이다.
별도의 제네릭 설정 없이 컬렉션 객체를 생성하면 Object => 다양한 타입을 다 담을 수 있다. 해당 컬렉션에 별도의 제네릭 설정으로 컬렉션 객체를 생성하면 그 "타입" => 그 타입만 담을 수 있다. (마치 배열처럼) |
제네릭 설정 시 주의사항
<타입> 은 항상 "참조자료형 타입" 이어야만 한다!! - 정수만 담고싶다 => X / O - 실수만 담고싶다 => X / O |
제네릭을 설정하는 이유
1. 명시한 타입의 객체만 저장 가능하도록 타입의 제한을 두기 위해서 2. 컬렉션에 저장된 객체를 꺼내서 사용할 때 매번 형변환 하는 과정을 없애기 위해서 (더 편리, 코드 간결, 코드 명확) |
4. 주요 인터페이스
1) List : 자료들을 순차적으로 나열한 자료구조로 인덱스로 관리되며, 중복해서 객체 저장 가능하다. 구현 클래스로 ArrayList와 Vector, LinkedList가 있다.
1. ArrayList : List의 후손으로 초기 저장 용량은 10으로 자동 설정되며 따로 지정도 가능하고, 저장 용량을 초과한 객체들이 들어오면 자동으로 늘어나며 고정 또한 가능하다. 동기화(Synchronized) 2를 제공하지 않는다.
예) List<E> list = new ArrayList<E>();
2. Vector : 역시 List의 후손으로 ArrayList와 동등하지만 동기화(Synchronized)를 제공한다는 점이 ArrayList와 차이점
이며 List 객체들 중에서 가장 성능이 좋지 않다.
3. LinkedList : List의 후손으로, 인접 참조를 링크해 체인처럼 관리한다. 특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞/뒤 링크만 변경하면 되기 때문에 객체 삭제와 삽입이 빈번하게 일어나는 곳에서는 ArrayList보다 성능이 좋다.
2) Set : 저장 순서가 유지되지 않고, 중복 객체도 저장하지 못하게 하는 자료 구조이며 null도 중복을 허용하지 않기 때문에 1개의 null만 저장한다.
1. HashSet : Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠르다. 동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않눈다.
2. LinkedSet : HashSet과 거의 동일하지만 Set에 추가되는 순서를 유지한다는 점이 다르다.
3. Enumeration, Iterator, ListIterator : 컬렉션에 저장된 요소를 접근하는데 사용된다.
- Enumeration : Iterator의 구버전
- ListIterator : Iterator를 상속받아 양방향 특징을 지닌다.
3) Map : 키(key)와 값(value)으로 구성되어 있으며, 키와 값은 모두 객체다. 키는 중복 저장을 허용하지 않고(Set방식), 값은 중복 저장 가능(List방식)이다. 키가 중복되는 경우, 기존에 있는 키에 해당하는 값을 덮어 씌운다. 구현 클래스로 HashMap, HashTable, LinkedHashMap, Properties, TreeMap이 있다.
1. HashMap : 키객체는 hashCode()와 equals()를 재정의해 동등객체가 될 조건을 정해야 한다. 때문에 키타입은 hashCode와 equals()메서드가 재정의되어있는 String 타입을 주로 사용한다.
예) Map<K, V> map = new HashMap<K, V>()
2. Properties : 키와 값을 모두 String타입으로 제한한 Map컬렉션이다. 주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로 사용한다. 참고로 프로퍼티 파일은 옵션정보, 데이터베이스 연결정보, 국제화(다국어)정보를 기록하여 텍스트 파일로 활용하고, 애플리케이션에서 주로 변경이 잦은 문자열을 저장하여 관리하기 때문에 유지보수를 편리하게 만들어 준다. 또한, 키와 값이 ‘=‘기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장되고, 한글은 유니코드(Unicode)로 변환되어 저장된다.