[Java] 컬렉션 개념 복습
컬렉션 ?
컬렉션 이란
여러 개의 다양한 데이터들을 쉽고 효과적으로 처리할 수 있도록 표준화 된 방법을 제공하는 클래스들의 집합
데이터를 효율적으로 저장하는 자료구조 와 데이터를 처리하는 알고리즘 이 미리 구현되어 있음
Java.util 패키지에 포함
1. LIST
List 인터페이스의 특징에 대해 이해하고 설명할 수 있다.
List는 저장 순서가 유지되고 중복 저장을 허용한다.
List 인터페이스 계열의 자료구조를 이해하고 설명할 수 있다.
ArrayList, LinkedList, Vector, Stack이 있다.
ArrayList의 사용 목적에 대해 이해할 수 있다.
가장 많이 사용되는 컬렉션 리스트이다.
ArrayList는 배열의 단점을 보완하기 위해 만들어졌다.
배열은 크기를 변경할 수 없고, 요소의 추가, 삭제, 정렬 등이 복잡하다는 단점을 가지고 있다.
ArrayList는 크기 변경(새로운 더 큰 배열을 만들고 데이터 옮기기), 요소의 추가, 삭제, 정렬 기능 등을
미리 메소드로 구현해서 제공하고 있다.
ArrayList의 구조에 대해 이해하고 인스턴스를 생성할 수 있다.
/* ArrayList는 인스턴스를 생성하게 되면 내부적으로 10칸짜리 배열을 생성해서 관리한다. */
ArrayList alist = new ArrayList();
/* 다형성을 적용하여 상위 래퍼런스로 ArrayList 객체를 만들 수도 있다.
* List 인터페이스 하위의 다양한 구현체들로 타입 변경이 가능하기 때문에
* 레퍼런스 타입은 List로 해 두는 것이 더 유연한 코드를 작성하는 것이다.
* */
List list = new ArrayList();
/* 더 상위 타입인 Collection 타입을 사용할 수 도 있다. */
Collection clist = new ArrayList();
ArrayList의 주요 메소드의 사용 방법을 숙지하고 개발에 적용할 수 있다.
ArrayList는 저장 순번이 유지 되며 index(순번)이 적용된다.
ArrayList는 Object 클래스의 하위 타입 인스턴스를 모두 저장할 수 있다.
- add() 추가
- size() 요소의 개수 반환
- remove() 삭제
- set() 수정
- clear() 리스트 내 모든 요소를 제거
- isEmpty() list가 비어있는지 확인
- toString() 모든 요소의 정보를 확인
Collections.sort() 메소드를 이용하여 오름차순과 내림차순 정렬을 할 수 있다.
Collections.sort()는 Collection 인터페이스가 아닌 Collections 클래스이다.
Collections.sort(List<T> list); //오름차순
조금 복잡하지만 내림차순 정렬을 할 수도 있다.
하지만 기본적으로 ArrayList에는 역순으로 정렬하는 기능은 제공되지 않는다.
역순 정렬은 LinkedList에 정의되어 있는데 현재 사용하는 ArrayList를 LinkedList로 변경할 수 있다.
stringList = new LinkedList<>(stringList);
/* Iterator 반복자 인터페이스를 활용해서 역순으로 정렬한다. */
Iterator<String> dIter = ((LinkedList<String>)stringList).descendingIterator();
/* 역순으로 정렬 된 결과를 저장하기 위해서는 새로운 ArrayList를 만들어서 저장해두면 된다. */
List<String> descList = new ArrayList<>();
while(dIter.hasNext()) {
descList.add(dIter.next());
}
Comparator 인터페이스를 활용한 ArrayList 정렬을 할 수 있다.
Collections.sort(List<T> list, Comparator<T> c)
LinkedList의 구조를 이해하고 인스턴스를 생성할 수 있다.
인접 참조를 링크해서 체인처럼 관리
특정 인덱스에서 인스턴스를 제거하거나 추가하게 되면 바로 앞 뒤 링크만 변경하면 되기 때문에
인스턴스 삭제와 삽입이 빈번하게 일어나는 곳에서는 ArrayList 보다 성능이 뛰어남
/* LinkedList 인스턴스 생성 */
List<String> linkedList = new LinkedList<>();
LinkedList의 주요 메소드의 사용 방법을 숙지하고 개발에 적용할 수 있다.
- add() 추가
- size() 요소의 개수 반환
- remove() 삭제
- set() 수정
- clear() 리스트 내 모든 요소를 제거
- isEmpty() list가 비어있는지 확인
- iterator() 저장된 인스턴스를 한번씩 가져오는 반복자 리턴
2. Stack / Queue
Stack 자료 구조를 이해하고 설명할 수 있다.
stack 은 제한적으로 접근할 수 있는 나열 구조로 데이터를 저장
후임선출 (LIFO Last Input First Out) 방식의 자료 구조
Stack의 주요 메소드의 사용 방법을 숙지하고 개발에 적용할 수 있다.
push() : Stack에 값을 넣을 때는 push() 메소드를 이용한다.
peek() : 해당 스택의 가장 마지막에(상단에 있는) 요소 반환
pop() : 해당 스택의 가장 마지막에 있는(상단에 있는) 요소 반환 후 제거
Queue 자료 구조를 이해하고 설명할 수 있다.
queue 는 선형 메모리 공간에 데이터를 저장
선입선출 (FIFO First Input First Out) 방식의 자료구조
Queue의 주요 메소드의 사용 방법을 숙지하고 개발에 적용할 수 있다.
offer() : 큐에 데이터를 넣을 때에는 offer() 를 이용한다.
peek() : 해당 큐의 가장 앞에 있는 요소(먼저 들어온 요소)를 반환한다.
poll() : 해당 큐의 가장 앞에 있는 요소(먼저 들어온 요소)를 반환하고 제거한다.
3. SET
Set 인터페이스의 특징에 대해 이해하고 설명할 수 있다.
Set은 수학의 집합과 같이 저장 순서가 유지되지 않고 , 중복 인스턴스도 저장하지 못하게 하는 자료구조이다.
(null 값도 중복하지 않게 하나의 null 만 저장한다.)
HashSet의 특징을 이해하고 주요 메소드 사용 방법을 숙지하여 개발에 적용할 수 있다.
Set 에 인스턴스를 저장할 때 hash 함수를 사용하여 처리 속도가 빠름
동일 인스턴스 뿐 아니라 동등 인스턴스도 중복하여 저장하지 않음
동일 : 완전히 같은 인스턴스
동등 : 다른 인스턴스이지만 특정한 기준들의 속성 값이 같음
LinkedHashSet의 특징을 이해하고 주요 메소드 사용 방법을 숙지하여 개발에 적용할 수 있다.
HashSet 과 거의 동일하지만 Set 에 추가되는 순서를 유지 함
TreeSet의 특징을 이해하고 주요 메소드 사용 방법을 숙지하여 개발에 적용할 수 있다.
TreeSet 클래스는 데이터가 정렬 된 상태로 저장 되는 이진 검색 트리의 형태로 요소를 저장한다.
이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
Set 인터페이스가 가지는 특징을 그대로 가지지만 정렬 된 상태를 유지한다는 것이 다른 점이다.
2. MAP
Map 인터페이스의 특징에 대해 이해하고 설명할 수 있다.
Collection 인터페이스와는 다른 저장 방식을 가진다.
키(key)와 값(value)를 하나의 쌍으로 저장하는 방식을 사용한다.
키(key)란? 값(value)을 찾기 위한 이름 역할을 하는 객체를 의미한다.
1. 요소의 저장 순서를 유지하지 않는다.
2. 키는 중복을 허용하지 않지만, 키가 다르면 중복 되는 값은 저장 가능하다.
Map 인터페이스 계열의 자료구조를 이해하고 설명할 수 있다.
HashMap, HashTable, TreeMap 등의 대표적인 클래스가 있다.
HashMap의 구조와 특성에 대해 설명할 수 있다.
HashMap이 가장 많이 사용 되며 HashTable은 JDK 1.0부터 제공되며
HashMap과 동일하게 동작 된다. 하위 호환을 위해 남겨놓았기 때문에 가급적이면 HashMap을 사용하는 것이 좋다.
/* 1. keySet()을 이용해서 키만 따로 set으로 만들고,
* iterator()로 키에 대한 목록을 만든다.
* */
//Set<String> keys = hmap2.keySet();
//Iterator<String> keyIter = keys.iterator();
Iterator<String> keyIter = hmap2.keySet().iterator();
while (keyIter.hasNext()) {
String key = keyIter.next();
String value = hmap2.get(key);
System.out.println(key + "=" + value );
}
/* 2. 저장 된 value 객체들만 values()로 Collection으로 만든다. */
Collection<String> values = hmap2.values();
/* 2-1. iterator()로 목록 만들어서 처리 */
Iterator<String> valueIter = values.iterator();
while(valueIter.hasNext()) {
System.out.println(valueIter.next());
}
/* 2-2. 배열로 만들어서 처리 */
Object[] valueArr = values.toArray();
for(int i = 0; i < valueArr.length; i++) {
System.out.println(i + " : " + valueArr[i]);
}
/* 3. Map의 내부 클래스인 EntrySet을 이용 : entrySet() */
Set<Map.Entry<String,String>> set = hmap2.entrySet();
Iterator<Map.Entry<String, String>> entryIter =set.iterator();
while(entryIter.hasNext()) {
Map.Entry<String,String> entry = entryIter.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}