[day16]

1. 컬렉션 Collection
JDK는 소위 자료구조 과목에서 배우는 많은 자료 구조들을 컬렉션으로 만들어 제공
제네릭이라는 기법으로 구현.

 

1)컬렉션을 위한 자바 인터페이스와 클래스 




[Collection]
- Vector, **ArrayList**  : 가변크기의 배열
- LinkedList : 노드들이 링크로 연결되는 리스트
- Stack : 스택
- HashSet: 집합

[Map]
- **HashMap** : 키와 값의 쌍으로 저장되는 컬렉션

2) 제네릭(generics) 기법
JDK1.5 부터 도입된 제네릭기법으로 컬렉션이 만들어짐
컬렉션들 이름에 <E><K><V>등이 포함 -> 타입매개변수(generic type)
ArrayList<Integer>  -> 정수만 저장하는 ArrayList
ArrayList<String>   -> 문자열만 저장가능하는 ArrayList

특정타입만 다루지 않고 여러종류의 타입으로 변신할 수 있도록 <E>을 사용
단, int, char, double등 기본타입으로는 제네릭 사용 불가!!
-> Integer, Character, Double 등 Wrapper 클래스로 지정해줘야함.
제네릭 객체형으로 기본형이랑은 안맞음
ArrayList<int>  (X)  -> ArrayList<Integer>

ex) 제네릭 타입을 가진 클래스
class Stack<E>{
.... void push(E element){.....}
E pop(){....}
}
E에 대한 구체적인 타입을 지정하면 지정된 타입만 다룰 수 있는 구체화된 스택이 된다.
-> 정수 스택 Stack<Integer>
void push(Integer element){...}
Integer pop(){...}

-> 문자열 스택 Stack<String>
void push(String elemet){...}
String pop(){...}
-> Tv 스택 Stack<Tv>
void push(Tv element){...}
Tv pop(){...}

E : element 요소
T : type
V : value
K : key

3) ArrayList<E> : java.util.ArrayList
: 가변 크기의 배열을 구현, vector와 거의 동일.
삽입되는 요소의 개수에 따라 자동 크기 조절.
요소 삽입/삭제에 따라 요소들의 자리 이동도 자동으로 처리.

# 주요 메서드
boolean  add(E elem) : 맨뒤에 elem 추가
void add(int idx, E elem) : idx위치에 elem 추가
boolean addAll(Collection c) : 컬렉션 c의 모든 요소를 뒤에 추가
void  clear() : 모든 요소 삭제
E remove (int idx) : idx 위치 요소 하나 삭제
boolean remove(Object o) : o와 같은 요소 삭제
E elemenAt(int idx) : idx 위치요소 리턴
E get(int idx) : idx 위치요소 리턴
E set(int idx, 값) : 수정전의 인덱스 값 리턴
boolean contains(Object o) : o를 포함하고 있으면 true
int  indexOf (Object o) : o와 같은 요소가 저장된 첫 인덱스 리턴, 없으면 -1 리턴
boolean isEmpty() : ArrayList가 비어있으면 true
int size() : 저장된 요소의 개수 리턴
Object[] toArray() : 저장된 요소를 배열로 리턴

 

package day16;

import java.util.ArrayList;

public class ClassEx52 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		// ArrayList 객체생성
		// 컬렉션명<제네릭 타입> 변수명 = new 컬렉션명<타입>();
		ArrayList<Integer> list = new ArrayList<Integer>(10);
		// ArrayList<int> list = new ArrayList<int>(10); 기본형으로 타입지정불가
		
		// #2. 요소삽입
		list.add(10);
		list.add(20);
		list.add(30);
		list.add(null); //null 삽입가능 주의
		list.add(3, 100); //원하는 인덱스 위치에 삽입가능
		
		System.out.println(list);
		
		//#3. 요소 꺼내기
		Integer i = list.get(0); // 리턴타입 그대로 받기
		int ii = list.get(1);    // 언박싱해서 기본형으로 받기
		System.out.println(i);
		System.out.println(ii);
		
		// #4. 요소의 개수
		int size = list.size();
		System.out.println(size);  //5개
		
		// #5. 요소의 삭제
		list.remove(2);
		System.out.println(list);
		//list.remove(10)        remove(Obeject o): 요소같은거 삭제 에러발생
		list.remove(new Integer (100));    //요소와 같은거 삭제시 객체로 전달해야함
		//기본형값 -> index, 객체값 -> 값으로 인식
		System.out.println(list);
		
		list.clear();
		System.out.println(list); // []
		System.out.println(list.isEmpty()); //true
		System.out.println(list.size());  // 0

	}
}




4) 제네릭 없이 사용
제네릭 없이 사용하면 다양한 타입의 요소를 같이 저장가능.
제네릭을 지정하지 않았기 때문에
모든 객체의 최상위 클래스인 Object형으로 처리된다.  // 대신 형변환 해서 꺼내써야한다. 


5) Vector<E> : java.util.Vector<E>
: 가변 배열 구조, ArrayList와 거의 동일
Vector는  스레드간 동기화 지원, ArrayList는 스레드간 동기화 지원 X



6) Iterator<E> : java.util.Iterator<E> 인터페이스 : 반복자
: Vector, ArrayList 등과 같이 컬렉션에 저장된 요소를 
순차적으로 검색할때 사용하면 편리함.

#주요 메서드
boolean  hasNext() : 다음 요소가 있으면 true
E next() : 다음요소를 가르키고 다음 요소를 리턴
void  remove() : 리턴된 요소 제거


7) **HashMap<K, V> : java.uti.HashMap ***
: 키(key)와 값(value)의 쌍으로 구성되는 요소들을 저장할 수 있는 자료구조.
K는 키로 사용할 데이터의 타입, V의 값으로 저장할 데이터의 타입을 제네릭으로 명시한다.

-> index가 없다. index 대신 key값으로 value를 꺼내옴
-> inderx를 사용자가 원하는 값으로 지정하는 사용자 지정 index라고 할 수도 있다.
-> key값 중복 허용 안되고, 순서가 없다.

#장단점
- 삽입, 삭제 시간이 매우 빠르다. 
위치를 결정하는 해쉬함수가 간단한 코드로 구성되어있고,
vector나 ArrayList 처럼 삽입, 삭제시 요초 위치 이동이 필요없기 때문
- 검색은 더욱 빠름
해쉬함수가 key 저장 위치를 바로 찾기 때문에
vector나 ArrayList처럼 모든 요소를 하나씩 비교하는 시간 낭비가 없다.

#주요 메서드
V  put(K key, V value) : key와 value 쌍으로 데이터 저장
V get(Obeject key) : 키에 해당하는 value 값 리턴, 없으면 null리턴
V remove(Object key) : 키를 찾아 키+밸류 삭제 
void clear() : 모든 요소 삭제
int size() : 요소의 개수 리턴
boolean isEmpty() : 요소가 하나도 없으면 true
      **Set<K>** keySet() : 모든 키들만 담아서 Set<K> 타입으로 리턴
boolean containKey(Object key) : key를 포함하고 있으면 true
boolean containValue(Object key): value에 일치하는 값이 있으면 true


8) LinkedList<E> 
: 요소들을 양방향으로 연결하여 관리한다는 점을 제외하고는
Vector, ArrayList와 거의 같다.
맨앞과 맨 뒤를 가르키는 haed, tail 레퍼런스 가지고있다.

9) Stack<E>
: Vector의 자식 클래스.
제한적으로 접근할 수 있는 나열식 구조로, 접근 방법은 마지막에서만 접근가능
LIFO (Last In First Out)


Queue<E> : FIFO(First In First Out)

10) Set<E> 인터페이스 -> HashSet<E> 구현 클래스
: 순서가 없고, 중복 데이터가 없는 컬렉션.
-> 동일한 값을 저장할 수 없다.

11) Properties 클래스
: HashMap의 구버전인 HashTable을 상속받아 구현한 클래스
K, V 형태로 데이터를 저장 (K = String, V = String)
주로 어플리케이션의 환경 설정과 관련된 속성을 저장하는데 사용한다. (컴파일안해도됨)

.properties 확장자를 가진 파일의 내용을 읽어들일때 유용한 클래스.

#주요 메서드
String  getProperty(String key) :키주고 값 꺼내기
Object setProperty(String key, String value)  : 키, 밸류 세트로 데이터추가
void load(InputStream inStream) : 외부파일을 스트림으로 읽은것 k,v 형태로 로딩함)



C Create : 생성 add()
R read   : 읽기 get()
U Update : 수정
D Delete : 삭제 remove() / clear()

'P-Language > [Java]' 카테고리의 다른 글

[Java] Hashmap Exercises  (0) 2022.06.07
[Java] 15 - 1 Calendar API  (0) 2022.06.04
[Java] 15 - 패키지와 API  (0) 2022.06.03
[Java] 14 - 싱글턴  (0) 2022.06.03
[Java] 13 - 12의 문제풀이  (0) 2022.06.03

+ Recent posts