Learn/KH정보교육원

[KH정보교육원 당산] 15일차 (Collection )

Dahoon06 2021. 3. 30. 22:26
728x90
반응형

Collection  

자료구조(Data Structure)를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 관련 패키지에 포함

자료(데이터) 수집에 관련된 API // 컬렉션 프레임웤(Collection FramWork)

 

 

- 주요 인터페이스 -

 

List계열

Map계열

Set계열


List계열

 literable - Collection - List(타입) - ArrayList / Vector / LinkedList / Stack 
  자료가 순차적이고, 중복적인 자료인 경우 사용(가장 대표적 : ArrayList) 

=> 객체를 인덱스로 관리(저장하면 자동으로 인덱스 부여)

 

- List 인터페이스를 구현한 클래스 -

 

   AbstractList, AbstractSequentialList, 

   ArrayList, AttributeList, CopyOnWriteArrayList,

   LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

 

   이 중에서 ArrayList, LinkedList가 많이 사용 된다.

 


LinkedList : ArrayLisy와 거의 비슷하지만 내부적으로 처리 과정이 다르다.

(인덱스 번호가 이동.)
 Array : 크기가 정해짐. 정적

 

ArrayList : 크기가 변동, 동적, 나중에 많이 사용(비동기:속도효율 높음) // 값 변경시 데이터의 위치가 변경 되는것(데이터가 이동)

 

Vector : 초기사용,동기적 (속도효율 낮음), 일반 배열의 단점인 크기를 보강하고자 만들어진 클래스

=> ArrayList가 생긴 이후로는 잘 사용안한다고 한다.

vector의 주요 메소드 = 값을 추가하는 addElement

List계열의 add메소드와 똑같다. 단지 vector 자신이 사용하는 메소드인지 아니면 List타입에서 받아온 메소드 인지의 차이 

 

반환타입 / 메소드 설명
boolean add(E e) 데이터 추가
void add(int index, E element) 해당 인덱스에 데이터 추가 
E set(int index, E element) 해당 인덱스에 데이터 대체
E get(int index) 해당 인덱스에 데이터 리턴
boolean isEmpty( ) 데이터 유무 확인
int size( ) 저장된 데이터 수 확인
void claer( ) 저장된 데이터 모두 삭제
E remove(int index) 해당 인덱스의 데이터 삭제 
boolean remove(Object o) 해당 데이터 삭제
Iterator<E> iterator( ) 저장된 객체를 한 번씩 가져오는 반복자 리턴

해당 인덱스에 데이터 추가

 

 

ArrayList와 LinkedList의 차이점은 내부 실행 과정에서 차이난다.

ArrayList의 경우 add메소드로 값을 추가 했을때 인덱스 번호는 그 자리를 유지하고 값이 인덱스 번호에 채워지는 식

LinkedList의 경우 값이 움직이는 것이 아니라 인덱스번호가 밀리던 당겨지던 인덱스 번호가 움직인다.

 

같은 조건에서 코드를 실행시켰을때 LinkedList가 더 빠르다.

 

System.nanoTime()메소드를 사용하여 출력시간을 구해봤다.

Queue와 Stack

Queue : First In First Out (FIFO)  선입선출

=> list계열을 구현 받기 때문에 list메소드 사용 가능

Queue는 데이터를 순차적으로 처리하기 위한 인터페이스다.

 

=>주요 메소드 : 값 저장  offer();

                      값 꺼내는 peek(); =>가장 앞에 있는 값을 꺼낸다. (데이터가 삭제되지않음)

                                    poll(); => 가장 앞에 있는 값을 꺼내고 지운다.

 

- Queue 인터페이스를 구현한 클래스 -

 

   AbstractQueue, Array BlockingQueue,ArrayDeque, ConcurrentLinkedQueue, 

   DelayQueue, LinkedBlockingDeque,LinkedBlockingQueue, LinkedList, 

   PriorityBlockingQueue, PriorityQueue, SynchronousQueue 등

 

   보통 LinkedList가 많이 사용된다.

 

Stack : Last In, First Out(LIFO) or First In Last Out(FILO)   ( 후입선출 or 선입후출 )  //  자료구조  

=> 주요 메소드 : 값을 추가하는 push("데이터");

                     값을 꺼내는 pop(); => pop메소드는 해당 값을 반환하고 그 값을 삭제 시킨다. 

                                    


Map계열

: Map - NavigableMap - Hashtable/HashMap / Properties / TreeMap

: 자료가 Key, Value로 저장하는 구조 ( 키는 중복불가, 값은 중복 저장 가능)

=> 동일한 키에 값을 저장할 경우 기존에 값은 삭제되고 새로운 값이 저장된다.

 

 

 

- Map 인터페이스를 구현한 클래스 - 

 

   AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, 

   ConcurrentSkipListMap, EnumMap, HashMap,Hashtable, IdentityHashMap, 

   LinkedHashMap, PrinterStateReasons,Properties, Provider, RenderingHints, 

   SimpleBindings, TabularDataSupport,TreeMap, UIDefaults, WeakHashMap

 

   이 중에서 HashMap, 을 많이 사용한다.


  

HashMap ( 대표적인 Map컬렉션)

2가지 예약 타입 < 키에관련, 값에관련 >
예시) Map <String,Integer> m = new HashMap <String,Integer> ();

키 값은 기본타입을 사용 할 수 없다. 클래스 및 인터페이스 타입만 가능

 

HashTable(요즘엔 잘 사용안함)

=>  HashMap과 동일한 내부구조

 

둘의 차이점

 *HashTable : old ver (동기화) => 멀티 스레드 불가(스레드가 안전)
 *HashMap : new ver.(비동기화) => 멀티 스레드 가능

 

Properties(웹에서 많이 사용:DB연동//파일을 읽을때)

=> HashTable의 하위 클래스( HashTable의 모든 특징 사용 가능)

단, 키와 값을 String 으로 제한

 

database.properties 예시 파일

 

값 확인
출력값

 

이렇게 사용하게 되면 나중에 유지보수하기 쉽고 값을 변경을 해도 코드를 따로 바꿔주지 않아도 된다.

 

 

TreeMap(군집분석)

 

기능 반환타입 / 메소드 설명
객체 추가 V put(K key, V value) 주어진 키로 값을 저장.
객체
검색
boolean containsKey(Object key) 주어진 키가 있는지 확인
boolean containsValue(Object value) 주어진 값이 있는지 확인
Set<Map.Entry<K,V>> enrtySet( ) 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
V get(Object key) 주어진 키가 있는 값을 리턴
boolean isEmpty() 컬렉션이 비어있는지 확인
int size( ) 저장된 키의 총 수를 리턴
Collection<V> values() 저장된 모든값을 Collection에 담아
리턴
객체 삭제 void clear() 모든 키와 값 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

 


Set계열

값을 저장 시키지만 저장 될 때 그 순서가 유지되지 않는다. 객체명 중복 저장 불가능 <== 값(데이터)만 저장!!

값만 저장 되기 때문에 인덱스를 통하여 값을 가져올 수 없다

=> 반복자(iterator( ) )를 통하여 값을 꺼냄 (Iterator 인터페이스를 구현한 객체)

 

- Set 인터페이스를 구현한 클래스 -

 

   AbstractSet, ConcurrentSkipListSet,CopyOnWriteArraySet, 

   EnumSet, HashSet, JobStateReasons, LinkedHashSet,TreeSet 

 

   HashSet이 많이 사용된다.

 

 

HashSet

객체를 순서없이 저장하고 중복 불가(해시 코드)!

기능 반환타입 / 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 저장, 저장되면 true, 중복저장시 false
검색 객체 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부 확인
isEmpty( ) 컬렉션이 비어있는지 확인
Iterator<E> iterator( ) 저장된 객체를 한 번씩 가져오는 반복자 리턴
int size( ) 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear( ) 저장된 모든 객체 삭제
boolean remove(Object o) 주어진 객체 삭제

 

- 값 꺼내기 -

 

Iterator 객체 생성

Iterator<String> itr = h.iterator();

while(itr.hasNext()) {

       System.out.println(itr.next());

} // 값을 꺼낼때 처음 출력값이랑 다를 수 있다. (순서가 저장 되지 않기때문)

 

Iterator 인터페이스에 선언된 메소드

리턴타입 / 메소드명 설명
boolean hasNext( ) 가져올 객체가 있으면 true를 리턴 없으면 false
E next( ) 컬렉션에서 하나의 객체를 가져온다.
void remove( ) Set 컬렉션에서 객체를 제거한다.

 

728x90
반응형