👨🏻‍💻

[JAVA]컬렉션1

과목
JAVA
태그
Collection
list
StudyDate
2020/12/27

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에 정의되어있는데 * 현재 사용하는 ArrayListListLinked로 변경할 수 있다. 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) 확인