1cm

자바 프로그래밍_Day_19_컬렉션(Collection) 본문

국비지원_Java/Java Programming_1

자바 프로그래밍_Day_19_컬렉션(Collection)

dev_1cm 2021. 9. 21. 21:03
반응형



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를 통해 설정정보를 보관한다.

 

 

 

 

 

반응형
Comments