1. 컬렉션이란?
•
여러개의 다양한 데이터들을 쉽고 효과적으로 처리할 수 있도록 표준화 된 방법을 제공하는 클래스들의 집합.(데이터를 효율적으로 저장하는 자료구조와 데이터를 처리하는 알고리즘이 미리 구현되어있다)
•
Java.util 패키지에 포함(약 52개)
2. 자료구조 형식
•
데이터(자료)를 메모리에서 효율적으로 저장하기 위한 방법론
2-1) 선형구조
•
리스트 : 객체배열이랑 유사한구조 값을 추가하고 삭제하는데 번거로움
•
연결리스트
1) : 단순연결리스트는 값을가지고오는데 연결이 한줄로 되어있어서 값을 탐색하는데
무조건 모든 값들을 거쳐서 가야됨
2) : 이중 연결리스트 : 단술연결리스트의 단점을보완하고자 ———>로도 연결되어있고
<———도 연결되어있음
3) : 원형 연결리스트 : 이중연결리스트에서 맨끝값과 맨처음값이 서로에 주소를 가지고 있어
값에 대한 탐색이 보다 쉬움
•
스택 : 후입선출에 구조
•
큐 : 선입선출
•
덱 : 들어오는곳과 나가는곳이 자유로움
2-2)비선형 구조
•
트리형:
1)이중트리 : 한 공간에 NODE 값(자기값) 그리고 그 아래 왼쪽,오른쪽에 각각 다른값을 저장
: 왼쪽은 자기값보다 작은값, 오른쪽은 자기값보다 큰값을저장
: 예를 들자면 위쪽은 부모NODE 아래는 자식NODE로 되어있으며 자식NODE를
2개까지만 가질수 있음
- 장점 : 검색속도가 빠르다(궁극적인 목적: 검색!)
3. 컬렉션의 주요 인터페이스
3-1 Collection
1) List 계열은 순서를 유지하고 저장이가능하므로 중복저장이 가능하다
ex) 칸이 구별되어진 저장공간에 넣어진다고 생각하자
2) Set 계열은 순서를 유지하지않고 저장 중복저장안됨
ex) 주머니에 다 때려박는식으로 저장 주머니는 하나의공간만있으므로
순서가없고 중복이안됨
3-2 MAP 계열 : 키(key)와 값(value)이 쌍으로 저장 키는 중복저장안됨
(Set방식을 이용>> Set을먼저하고 Map을 한다)
키(key)값은 중복이안되지만 값(value)는 중복이된다
HashMap, TreeMap, HashTable, Properties
4. ArrayList
•
가장많이 사용되는 컬렉션 클래스
•
내부적으로 배열을 이용하여 요소를 관리하며 인덱스를 배열요소에 접근가능
•
예시(내부적으로 10개의칸을 설정한.
•
배열의 단점을 보완하기 위해서 만들어짐
•
배열은 크기를 변경할 수 없고, 요소의 추가, 삭제, 정렬 등이 복잡하다는 단점을 가지고있음
•
ArrayList는 배열의 단점을 보완하고자 크기변경(새로운 더 큰 배열을 만들고 옮기기), 요소의 추가, 삭제, 정렬 기능들을 미리 메소드에서 구현해서 제공하고 있다.
•
자동으로 제공하는것이지 속도의 이점은 없다.
•
하지만 효율적인 알고리즘으로 작성되어있기때문에 그보다 잘만들게 아니면 그냥쓰자!!
•
특징
1.
저장하는 크기의 제약이없음
2.
추가,삭제.정렬 등의 기능처리가 간단하게 해결
(자료구조가 내장되어 있어 따로복잡한 알고리즘 불필요)
3. 여러타입의 데이터가 저장가능
(다만 인스턴스만 저장할수 있기 때문에 기본자료형을 저장해야할 경우 Wrapper클래스 사용)
4 -1 코드예시
다형성을 적용하여 상위 레퍼런스로 ArrayList 인스턴스를 생성 할 수 있다.
List 인터페이스 하위의 다양한 구현체(인터페이스를 상속받은 클래스)들로
타입 변경이 가능하기 때문에레퍼런스 타입은 List로 해두는 것이
더 유연한 코드를 작성하는 것이다.
List list = new ArrayList();
Collection clist = new ArrayList();
arrayList는 저장 순서가 유지되며 index(순번) 이 적용된다.
**arrayList는 Object 클래스이 하위 타입 인스턴스를 모두 저장할 수 있다.
list.add("apple");
list.add(123); //오토 박싱(값을 인스턴스화) 적용됨
list.add(45.67);
list.add(new Date());
System.out.println(list);
Java
복사
4-2 코드예시2 (size(), add(), set(), remove(), Collections)
1. ArryaList 내의 요소갯수는 size() 메소드로 확인할 수 있다.
단, size()는 배열의 크기가 아닌 요소의 갯수를 반환한다.
System.out.println("list의 size : " + list.size());
내부 배열에 인덱스가 지정되어 있기 떄문에 for문으로 접근이 가능하다.
for(int i = 0; i < list.size(); i++) {
2. 인덱스에 해당하는 값을 가져올 때는 get() 메소드를 사용한다.
System.out.println(i + " : " + list.get(i));
}
ArrayList는 데이터 중복 저장을 허용한다.
배열과 같이 인덱스 요소들을 관리하기 때문에
인덱스가 다른 위치에 동일한 값을 저장하는 것이 가능하다.
list.add("apple");
System.out.println("list : " + list);
원하는 인덱스 위치에 값을 추가 할 수 있다.
값을 중간에 추가하는 경우 인덱스 위치에 덮어쓰는것이 아니고
새로운 값이 들어가는 인덱스 위치에 값을 넣고 이후 인덱스는 하나씩 뒤로 밀리게 된다.
list.add(1, "banana");
System.out.println("list : " + list);
3. 저장된 값을 삭제할 때는 remove() 메소드를 사용한다.
중간 인덱스의 값을 삭제하는 경우 자동으로 인덱스를 하나씩 앞으로 당긴다.
list.remove(2);
System.out.println("list : " + list);
4. 지정한 위치의 값을 수정할 때도 인덱스를 활용할 수 있으며 set()메소드를 사용한다.
list.set(1, new Boolean(true));
list.set(1, true);
System.out.println("list : " + list);
모든 컬렉션 프레임워크 클래스는 제네릭 클래스로 작성 되어 있다.
List<String> stringList = new ArrayList<>();
stringList.add("apple");
// StringList.add("123"); >> String이므로숫자xxx
stringList.add("apple");
stringList.add("cpple");
stringList.add("banna");
System.out.println("stringList" + stringList);
*저장 순서를 유지하고 있는 stringList를 오름차순으로 정렬
* Collection 인터페이스가 아닌 Collections라는 클래스이다.!
* Collection에서 사용되는기능들을 static 메소드들로 구현한 클래스이며
* 인터페이스명 뒤에 s가 붙은 클래스들은 관례상 비슷한 방식으로
작성된 클래스를 의미하게된다.
Collections.sort(stringList);
/*sort 메소드를 사용하면 list가 오름차순으로 정렬 처리된 후 정렬 상태가 유지된다.*/
System.out.println("stringList : " + stringList);
Java
복사
코드예시3 (내림차순) — 어려우니깐 중점적으로보기
*조금 복잡하지만 내림차순으로 정렬할 수 있다.
* 기본적으로 ArrayList는 역순으로 정렬하는 기능이 제공되지 않는다.
* 역순 정렬 기능은 LinkedList에 정의되어있는데
* 현재 사용하는 ArrayList를 ListLinked로 변경할 수 있다.
stringList = new LinkedList<>(stringList);
1. Iterator반복자 인터페이스를 활용해서 역순으로 정렬한다.
이때 Iterator에도 제네릭을 설정한다.
LinkedList 타입으로 형변환 한 후 decendingIterator() 메소드를 사용하면
내림차순으로 정렬된 Iterator 타입의 목록으로 반환해준다.
2.Iterator<String> dIter = ((LinkedList<String>)stringList).descendingIterator();
* Iterator란?
* Collection 인터페이스 iterator()메소드를 이용해서 인스턴스를 생성할 수 있다.
* 컬렉션에서 값을 읽어오는 방식을 통일된 방식으로 제공하기 위해 사용한다.
* 반복자라고 불리우며, 반복문을 이용해서 목록을 하나씩 꺼내서
사용하기 위한 목적으로 사용한다.
* 인덱스로 관리되는 컬렉션이 아닌 경우 반복문을 사용해서
요소에 하나씩 접근할 수 없기 때문에
인덱스를 사용하지 않고도 반복문을 사용하기 위한 목록을 만들어주는
역할이라고볼수있다.
* hanNext() : 다음 요소를 가지고 있는경우 true,
더이상 요소가 없는경우 fasle를반환
* next() : 다음 요소를 반환
while(dIter.hasNext()) {
System.out.println(dIter.next());
* 한 번 꺼내온 목록은 재사용이 불가능하다.
* 따라서 정렬된 값을 유지하려면 다른ArrayList를 만들어서 정렬된 값을 저장해야한다.
3.List<String>descList = new ArrayList<>();
while(dIter.hasNext()){
4. descList.add(dIter.next());
}
System.out.println("descList : " + descList);
}
}
Java
복사
4-1 List 계열 주요 메소드
5. STACK
6 .Queue(큐)
7.Comparator
•
Comparator는 인터페이스므로 생성자 생성불가
•
클래스를 하나 생성해 implement를 받아서 이용해야한다.
•
혹은 메인메서드에서 익명클래스를 이용해 직접사용할 수 있다.
bookList.sort(new Comparator<BookVO>() {
@Override
public int compare(BookVO o1, BookVO o2) {
return o1.getPrice() > o2.getPrice() ? 1 : -1;
}
});
Java
복사
•
Comparator<> 에 다이아몬드연산자에 제네릭을 설정해줄수 있다
•
설정을 안하면 Object를 상속
•
코드예시 1) 익명클래스를 이용한 오름차순
package com.greedy.section01.list.run;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import com.greedy.section01.list.vo.BookVO;
public class Application2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*여러 권의 책목록을 관리할 ArrayList 인스턴스 생성*/
List<BookVO> bookList = new ArrayList<BookVO>();
/*도서 정보 추가 */
bookList.add(new BookVO(1, "홍길동전", "허균", 50000));
bookList.add(new BookVO(2, "목민심서", "정약용", 30000));
bookList.add(new BookVO(3, "동의보감" , "허준" , 40000));
bookList.add(new BookVO(4, "한국사기" , "김부식", 46000));
bookList.add(new BookVO(5, "삼국유서", "일연" , 50000));
System.out.println("bookList = " + bookList);
for(BookVO book : bookList) {
System.out.println(book);
}
/*제네릭 타입 제한에 의해(Comparable 타입을 가지고 있는 경우에만 sort가 가능하다*/
// Collections.sort(bookList);
/*가격 순 오름차순 정렬*/
// bookList.sort(new AscendingpPrice());
bookList.sort(new Comparator<BookVO>() {
@Override
public int compare(BookVO o1, BookVO o2) {
return o1.getPrice() > o2.getPrice() ? 1 : -1;
}
});
/*정렬 후 결과 출력*/
System.out.println("가격 순 오름차순 정렬 ========================");
for(BookVO book : bookList) {
System.out.println(book);
}
/* 가격 순 내림차순 정렬*/
bookList.sort(new Comparator<BookVO>() {
@Override
public int compare(BookVO o1, BookVO o2) {
return o1.getPrice() >= o2.getPrice()? -1 : 1 ;
}
});
System.out.println("내림 차순 정렬 확인 --------------");
for(BookVO book : bookList) {
System.out.println(book);
}
}
Java
복사
7-1 String계열은 어떻게 비교할까..?
•
문자열은 대소비교를 할 수없다.
•
문자배열로 변경 후 인덱스 하나하나를 비교해서 어느것이 더 큰값인지 확인필요
•
String 클래스의 compareTo() 메소드에서 이미 정의해놓았다.
•
앞에 값이 더 작은경우(즉 바꾸지않아도 되는경우) 음수반환
같으면 0반환 ,앞의 값이 더 큰경우 양수반환(바꿔야하는경우)
bookList.sort(new Comparator<BookVO>() {
@Override
public int compare(BookVO o1, BookVO o2) {
return o1.getTitle().compareTo(o2.getTitle())
Java
복사
8. LINKED LIST
•
ArrayList가 배열을 이용해서 발생할 수 있는 성능적인 단점을 보완하기 위해 고안되었다.
내부는 이중 연결 리스트로 구현되어 있다
•
LinkedList는 이중 연결리스트를 구현한 것이며 역시 List 인터페이스를 상속 받아서
* ArrayList와 사용하는 방법은 거의 유사하다
* 하지만 내부적으로 요소를 저장하는 방법에 차이가 있어서 상황에 따라 자료구조를 이용하는것이 좋다.
•
요소추가 : add(), 요소크기: size(), 요소를꺼내올때 get(), 요소를 제거할 때 remove(),set()을 이용하여 요소를 수정 .,toString(): 요소정보 쉽게확인, isEmpty(): 비었는지(true)안비었는지(false) 확인