| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- TIL
- 프레임워크
- javaprogramming
- sqldeveloper
- 자바프로그래밍
- springaop
- SpringMVC
- 스프링
- Oracle
- web
- js
- progressive web app
- 자바스크립트
- CSS
- framework
- 프로그레시브웹앱
- TodayILearned
- 메이븐
- 서브쿼리
- HTML
- javascript
- 오라클
- 생활코딩
- mybatis
- PWA
- tdd
- 국비지원
- JavaScript 내장객체
- maven
- sql
- Today
- Total
1cm
자바 프로그래밍_Day_19_컬렉션(Collection) 본문

2021.09.10
> 컬렉션(Collecetion)
-> 메모리상에서 자료를 구조적으로 처리하는 방법을 자료구조라 일컫는데 컬렉션(Collection)은 자바에서 제공하는 자료구조를 담당하는 프레임 워크다.
-> 추가, 삭제, 정렬 등의 기능처리가 간단하게 해결 되어 자료구조적 알고리즘을 구현할 필요가 없다. (효율적으로 데이터에 접근, 사용 가능)
-> java.util 패키지에 포함되며, 인터페이스를 통해 정형화된 방법으로 다양한 컬렉션 클래스 이용이 가능하다.
> 자료구조
-> 데이터(자료)를 메모리에서 구조적으로 처리하는 방법 론이다.

-> 선형구조 -> 직선 (데이터를 순차적으로 나열해서 저장하는 방법)
-> 비선형구조 -> 저장되는 데이터가 불규칙, 연결관계 복잡
> 배열의 문제점 & 컬렉션의 장점
-> 배열의 문제점
-> 1. 한 번 크기를 지정하면 변경할 수 없다.
-> 공간 크기가 부족하면 에러가 발생 -> 할당 시 넉넉한 크기로 할당하게 됨 (메모리 낭비)
-> 필요에 따라 공간을 늘리거나 줄일 수 없음
-> 2. 배열에 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
-> 추가, 삭제할 데이터부터 마지막 기록된 데이터까지 하나씩 뒤로 밀어내고 추가해야 한다.(복잡한 알고리즘)
-> 3. 한 타입의 데이터만 저장이 가능하다.
-> 컬렉션의 장점
-> 1. 저장하는 크기의 제약이 없다. (공간이 부족하면 자동으로 늘려준다.)
-> 2. 추가, 삭제, 정렬 등의 기능 처리가 간단학게 해결된다.
-> 자료를 구조적으로 처리 하는 자료구조가 내장되어 있어 알고리즘 구현이 필요 없다.
-> 3. 여러 타입의 데이터가 저장 가능하다.
-> 객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을 저장해야 하는 경우 Wrapper클래스를 사용한다.
> 컬렉션의 주요 인터페이스

| 인터페이스 분류 | 특징 | 구현 클래스 | |
| Collection | List 계열 | - 순서를 유지하고 저장 - 중복 저장 가능 |
ArrayList, Vector, LinkedList |
| Set 계열 | - 순서를 유지하지 않고 저장 - 중복 저장 불가능 |
HashSet, TreeSet | |
| Map 계열 | - 키와 값의 쌍으로 저장 - 키는 중복 저장 안됨 |
HashMap, HashTable, TreeMap, Properties |
|
> List
-> 자료들을 순차적으로 나열한 자료구조로 인덱스로 관리되며, 중복해서 객체 저장이 가능하다.
-> 구현 클래스로는 ArrayList와 Vector, LinkedList가 있다.

-> 배열처럼 인덱스로 관리하면서 객체들만 저장할 수 있다.
-> 일렬로 늘어놓은 형태로 생성이 되며, 해당하는 인덱스를 지우면 기존에 뒤에 있던 객체들이 한 칸씩 앞으로 당겨진다.
-> List 계열 주요 메소드
| 기능 | 메소드 | 리턴타입 | 설명 |
| 객체 추가 | add (E e) | boolean | 주어진 객체를 맨 끝에 추가 |
| add (int index, E element) | void | 주어진 인덱스에 객체를 추가 | |
| addAll (Colection <? extends E> c) | boolean | 주어진 Collection타입 객체를 리스트에 추가 | |
| set (int index, E element) | E | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 | |
| 객체 검색 | contains (Object o) | boolean | 주어진 객체가 저장되어 있는지 여부 |
| get (int index) | E | 주어진 인덱스에 저장된 객체를 리턴 | |
| iterator() | Iterator<E> | 저장된 객체를 한번씩 가져오는 반복자 리턴 | |
| isEmpty() | boolean | 컬렉션이 비어 있는지 조사 | |
| size() | int | 저장되어 있는 전체 객체수를 리턴 | |
| 객체 삭제 | clear() | void | 저장된 모든 객체를 삭제 |
| remove(int index) | E | 주어진 인덱스에 저장된 객체를 삭제 | |
| remove(Object o) | boolean | 주어진 객체를 삭제 |
-> ArrayList
-> List의 후손으로 초기 저장 용량은 10으로 자동 설정되며 따로 지정도 가능하다. (초과 시 자동으로 늘어남)
-> 저장 용량을 초과한 객체들이 들어오면 자동으로 늘어나며 고정도 가능하다.
-> 동기화(Synchronized)를 제공하지 않는다.
-> ex) List<E> list = new ArrayList<E>();
-> E타입의 객체 10개를 저장할 수 있는 공간이 생성된다(배열)
-> *동기화 : 하나의 자원(데이터)에 대해 여러 스레드가 접근 하려 할 때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것.
-> Vector
-> List의 후손이며 ArrayList와 동등하지만 동기화(Synchronized)를 제공한다는 점이 ArrayList와 차이점이 있다. -> List 객체들 중에서 가장 성능이 좋지 않다.
-> LinkedList
-> List의 후손으로, 인접 참조를 링크해 체인처럼 관리한다.
-> 특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞/뒤 링크만 변경하면 되기 때문에 객체 삭제와 삽입이 빈번하게 일어나는 곳에서는 ArrayList보다 성능이 좋다.
-> Comparable, Comparator
| Comparable | Comparator | |
| 패키지 | java.lang | java.util |
| 사용 메소드 | compareTo() | compare() |
| 정렬 | 기존의 정렬기준을 구현하는데 사용 | 그 외 다른 여러 기준으로 정렬하고자 할 때 사용 |
| 사용법 | 정렬하고자 하는 객체에 Comparable를 상속받아 compareTo() 메소드를 오버라이딩해 기존의 정렬 기준 재정의 -> 한 개의 정렬만 가능 |
vo 패키지 안에 필요한 정렬 기준에 맞춘 클래스들을 생성하고 Comparator를 상속받아 compare() 메소드를 오버라이딩 해 기존의 정렬 기준 재정의 -> 여러 개의 정렬 가능 |
-> Collections.sort()
-> Collections.sort(List<T> list) -> T 객체에 Comparable을 상속받아 compareTo 메소드 재정의를 통해 정렬 구현 (단 한 개의 정렬)
-> Collections.sort(List<T> list, Comparator<T> c) -> 지정한 Comparator 클래스에 의한 정렬(여러 개의 정렬)
-> list의 저장된 데이터들을 정렬해줄 때 collections.sort 메소드를 사용한다.
-> Comparable, comparator를 구현해서 넘겨주면 각자의 역할에 맞게 정렬된다. 정렬하는 기준은 list에 담을 클래스에서 정의해줘야 한다.
> 컬렉션(Collection) - 리스트(List) 코드 실습과 출력 결과
> chap1.list.compare.ArtistAscending

> chap1.list.compare.TitleAscending

> chap1.list.model.vo.Music


> chap1.list.A_ArrayList.method1


> chap1.list.Application

> chap1.list.A_ArrayList.method2


> chap1.list.Application

> chap1.list.A_ArrayList.method3

-> 기존에 있던 걸 그대로 돌리고 새로운 방식으로 sort하고 싶을 경우 comparator를 활용한다.
> chap1.list.Application

> Set
-> 저장 순서가 유지되지 않고, 중복 객체도 저장하지 못하게 하는 자료 구조다.
-> null도 중복을 허용하지 않기 때문에 1개의 null만 저장한다.
-> 구현 클래스로 HashSet, LinkedSet, TreeSet이 있다.
-> Set은 인덱스로 관리되지 않는다.(get이 없음) 대신 객체의 대상을 하나씩 반복자라는 것을 제공한다.
-> Set 계열 주요 메소드
| 기능 | 메소드 | 리턴타입 | 설명 |
| 객체 추가 | add (E e) | boolean | 주어진 객체를 맨 끝에 추가 |
| addAll (Collection <? extends E> c) | boolean | 주어진 Collection타입 객체를 리스트에 추가 | |
| 객체 검색 | contains (Object o) | boolean | 주어진 객체가 저장되어 있는지 여부 |
| iterator() | Iterator<E> | 저장된 객체를 한번씩 가져오는 반복자 리턴 | |
| isEmpty() | boolean | 컬렉션이 비어있는지 조사 | |
| size() | int | 저장되어 있는 전체 객체수를 리턴 | |
| 객체 삭제 | clear() | void | 저장된 모든 객체를 삭제 |
| remove (Object o) | boolean | 주어진 객체를 삭제 |
-> 전체 객체 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공 인덱스로 객체에 접근할 수 없다.
-> 이름이 겹치는 메소드는 컬렉션에 맞게 각각 구현했다고 보면 된다.
-> HashSet
-> Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠르다.
-> 동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않는다.
-> LinkedHashSet
-> HashSet과 거의 동일하지만 Set에 추가되는 순서를 유지한다는 점이 다르다.
> Enumeration, Iterator, ListIterator
-> 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
-> Enumeration : Iterator의 구버전
-> ListIterator : Iterator를 상속받아 양방향 특징

-> 왼쪽 그림의 상속 구조 때문에 iterator() 메소드는 List와 Set 계열에서만 사용된다
-> Map의 경우 Set 또는 List화 시켜서 iterator()를 사용해야 한다.
-> 주요 메소드
| Iterator <E> | boolean hasNext() | 앞에서부터 검색 |
| E next() | ||
| ListIterator<E> | boolean hasNext() | 앞에서부터 검색 |
| E next() | ||
| boolean hasPrevious() | 뒤에서부터 검색 | |
| E previous() |
> 컬렉션(Collection) - 셋(Set)코드 실습과 출력 결과
> chap2.Set.model.vo.Music


> chap2.Set.A_HashSet


> chap2.Set.Application

> chap2.Set.B_TreeSet


> chap2.Set.Application

> Map
-> 키(Key)와 값(Value)으로 구성되어 있으며, 키와 값은 모두 객체다.
-> 키는 중복 저장을 허용하지 않고(Set 방식), 값은 중복 저장이 가능하다.(List 방식)
-> 키가 중복되는 경우 기존에 있는 키에 해당하는 값을 덮어 씌운다.
-> 구현 클래스로 HashMap, HashTable, LinkedHashMap, Properties, TreeMap이 있다.

-> 데이터를 저장할 때 키(key)와 값(value)를 쌍으로 묶는다. 이것을 Entry 객체라고 부른다.
-> Map 계열 주요 메소드
| 기능 | 메소드 | 리턴타입 | 설명 |
| 객체 추가 | put (K key, V value) | V | 주어진 키와 값을 추가, 저장이 되면 값을 리턴 |
| 객체 검색 | containsKey (Object key) | boolean | 주어진 키가 있는지 확인하여 결과 리턴 |
| containsValue (Object value) | boolean | 주어진 값이 있는지 확인하여 결과 리턴 | |
| entrySet() | Set<Map.Entry<K,V>> | 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 set에 담아서 리턴 | |
| get (Object key) | V | 주어진 키의 값을 리턴 | |
| isEmpty() | boolean | 컬렉션이 비어있는지 여부 | |
| keySet() | Set<K> | 모든 키를 Set 객체에 담아서 리턴 | |
| size() | int | 저장된 키의 총 수를 리턴 | |
| value() | Collection<V> | 저장된 모든 값을 Collection에 담아서 리턴 | |
| 객체 삭제 | clear() | void | 모든 Map.Entry를 삭제함 |
| remove (Object key) | V | 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴한다. |
-> HashMap
-> 키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 한다.
-> 때문에 키 타입은 hashCode()와 equals()메소드가 재정의되어 있는 String 타입을 주로 사용한다.
-> 키(key) - 중복 불가능(Set) - 중복된 키값 입력 시 이전 키값 사라지고 최근 입력된 키값으로 덮어씌워짐. / 값(value) - 중복 가능 (Collection)
-> ex) Map <K, V> map = new HashMap<K, V>();
-> Hashtable
-> 키 객체 만드는 법은 HashMap과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에, 복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드가 안전하다.(Thread safe)
-> ex) Map <K, V> map = new HashTable <K, V>();
> 컬렉션(Collection) - 맵(Map)코드 실습과 출력 결과
> chap3.model.vo.Snack

> A_HashMap.method1

> chap3.Application

> A_HashMap.method2


> chap3.Application

> Properties
-> 키와 값을 String 타입으로 제한한 Map컬렉션이다.
-> 주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로 사용한다.
-> 프로퍼티(*.properties) 파일
-> 옵션정보, 데이터베이스 연결정보, 국제화(다국어)정보를 기록하여 텍스트 파일로 활용한다.
-> 애플리케이션에서 주로 변경이 잦은 문자열을 저장하여 관리하기 때문에 유지보수를 편리하게 만들어준다.
-> 키와 값이 '='기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장되고, 한글은 유니코드(Unicode)로 변환되어 저장된다.
-> Properties 메소드
| 기능 | 메소드 | 리턴타입 | 설명 |
| Properties 객체에 저장 및 가져오기 | getProperty(String key) | String | Properties 객체에 해당 key값에 해당하는 value값 리턴 |
| setProperty(String key, String value) | Object | Properties 객체에 해당 key값과 value값이 세트로 저장 | |
| 파일 입출력 | store(OutputStream out, String comments) | void | 바이트 스트림으로 저장된 정보를 파일에 출력 저장 |
| store(Writer writer, String comments) | void | 문자 스트림으로 저장된 정보를 출력 저장 | |
| storeToXML(OutputStream os, String comment) | void | 저장된 정보를 바이트 스트림으로 xml로 출력 저장 | |
| load(InputStream inStream) | void | 바이트 스트림으로 저장된 파일의 내용을 읽어와서Properties 객체에 저장 | |
| load(Reader reader) | void | 문자 스트림으로 저장된 파일의 내용을 읽어와서 Properties 객체에 저장 | |
| loadFromXML(InputStream in) | void | 바이트 스트림으로 저장된 xml 파일의 내용을 읽어와서 Properties 객체에 저장. |
-> setProperty는 put과 같은 거라고 보면 된다.
-> store - 저장할 때 / load - 읽어올 때 / xml - 다목적으로 사용할 마크업언어
> TreeSet과 TreeMap
-> 검색 기능을 강화시킨 컬렉션으로, 계층 구조를 활용해 이진 트리 자료구조를 구현하여 제공한다. (하나의 노드로 두 개의 다른 노드가 연결이 될 수 있는 구조)
-> * 트리 : 각 노드 간 연결된 모양이 나무와 같다고 해서 붙여진 이름이다.


-> 가장 처음에 저장되는 값은 루트노드로 그 다음 루트노드와 값을 비교하면서 부모노드 -> 자식노드로 이어간다.
> TreeSet
-> 이진 트리를 기반으로 한 Set 컬렉션으로, 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성된다.

> TreeMap
-> 이진 트리를 기반으로 한 Map 컬렉션으로, 키와 값이 저장된 MapEntry를 저장하고 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성된다.

> TreeSet, TreeMap 정렬
-> 오름차순(기본 정렬)
-> TreeSet의 객체와 TreeMap의 key는 저장과 동시에 자동 오름차순 정렬이 된다.
-> 숫자(Integer, Double) 타입일 경우 값으로 정렬된다.
-> 문자열(String) 타입일 경우 유니코들 정렬된다.
-> 정렬을 위해 java.lang.Comparable을 구현한 객체를 요구한다. 그렇지 않을 경우 ClassCastException이 발생한다.
-> (Integer, Double, String 모두 Comparable 인터페이스를 통해 오름차순이 구현되어 있음)
-> 내림차순(따로 구현)
-> TreeSet, TreeMap 객체 생성 시 매개변수 생성자를 통해 재정렬이 가능하다.
-> ex. TreeSet<E> tSet = new TreeSet(Comparator<? super E> comparator);
-> TreeMap<K, V> tMap = new TreeMap(Comparator<? super K> comparator);
-> 또 다른 방법으로 숫자(Integer, Double), 문자열(String) 타입을 제외한 Comparable을 상속 받는 객체인 경우 compareTo() 메소드의 오버라이딩 부분을 내림차순으로 변경한다.
> 프로퍼티 (Properties) 코드 실습과 출력 결과
> chap3.B_Properties.method1

> chap3.Application

> chap3.B_Properties.method2

> chap3.Application

> test.xml

> test1.properties

-> xml, properties를 통해 설정정보를 보관한다.
'국비지원_Java > Java Programming_1' 카테고리의 다른 글
| 자바 프로그래밍_Day_21_네트워크(Network), 스레드(Thread) (0) | 2021.09.24 |
|---|---|
| 자바 프로그래밍_Day_20_제네릭스(Generics) (0) | 2021.09.21 |
| 자바 프로그래밍_Day_18_입출력(IO) (0) | 2021.09.21 |
| 자바 프로그래밍_Day_17_예외처리(Exception) (0) | 2021.09.19 |
| 자바 프로그래밍_Day_16_기본API (0) | 2021.09.15 |