2022/2/22
컬렉션 Collection
: 자료구조 과목에서 배우는 많은 자료구조들을 컬렉션으로 만들어 제공.
제네릭이라는 기법으로 구현. 배열이 가진 고정 크기의 단점을 극복하기 위해서 가변 크기의 컨테이너로 만들어져 있음. 가변 크기라서 공간 크기를 염려할 필요가 없으며 중간에 있는 객체를 삭제하면 자동으로 재배열이 됨.
1. 컬렉션을 위한 자바 인터페이스와 클래스

[Collection 상속, 단일 클래스 객체]
- Vector*, ArrayList*: 가변 크기의 배열
- LinkedList: 노드들이 링크로 연결되는 리스트
- Stack: 스택
- HashSet: 집합
[Map 상속]
- HashMap*: 키(Key)와 값(Value)의 쌍으로 이루어진 값을 저장하는 컬렉션
(*) 별표 된 거 집중 공부
2. 제네릭(generic) 기법
: 컬렉션은 제네릭 기법으로 만들어짐. 클래스 이름에 <E>, <K>, <V> 등이 포함 -> 타입 매개변수 (generic type)이라고 부른다.
Vector <Integer> -> 정수만 저장하는 벡터
Vector <String> -> 문자열만 저장하는 벡터
내부에 저장할 데이터들이 어떤 타입으로 들어갈지 한정해주는 것. 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 <E>를 사용.
단!! 타입에는 int, char, double 등 기본형으로 제네릭 사용 불가! Wrapper 클래스로 지정해줘야 한다. 타입이 고정되어 있는 게 아니라 객체 생성에 따라 내부가 타입에 맞게 변한다.
ex) 제네릭 타입을 가진 클래스
class Stack <E> {
void push(E elemnt){…} //데이터 받아주는 변수도 E 타입
E pop(){…}
}
Stack <String> Stack <String> s =new Stack <String>
void push (String element){…}//이렇게 바꿀 수 있음
String pop(){…} //E로 지정한 부분은 다 타입 바꿀 수 있다.
E: Element 요소
T: Type
V: Value
K: Key
(제네릭 없이 사용)
제네릭 타입을 생략하면 Object로 처리가 됨. 모든 타입을 섞어서 저장 가능. 그러나 꺼냈을 때도 Object로 돌려주므로, 내용물을 온전히 잘 사용하려면, 맞는 타입으로 형 변환해 담아서 사용해야 한다.
ArrayList <E>
: java.util.ArrayList 가변 크기의 배열을 구현, Vector와 거의 동일하지만 스레드 간에 동기화 지원을 하지 않는 게 벡터와의 차이점이다. /*내가 여기서 작업을 하면서 잠깐 기다려 나 작업 중이야 작업 완료된 결과로 가져갈 수 있도록 하는 게 동기화. 한꺼번에 접근해서 쓰니까 처리 속도는 빠르지만 정확한 데이터인지는 확실하지 않다는 단점 있다 스레드가 여러 개라면.. 속도는 빠름. 동기화 지원을 안 하면 딜레이는 생기지만 데이터 처리가 정확함. */
다수의 스레드가 동시에 ArrayList 요소 삽입/ 삭제 시 데이터 훼손 우려되지만, 멀티 스레드 동기화 시간 소모 없어 Vector보다 속도 빠름.
중간에 빈 공간이 생기면 요소 위치 자동 이동 시킴. 초기 사이즈는 10개 공간이나 부족하면 자동으로 늘어남.
1. 객체 생성
ArrayList <타입 매개 변수> 변수 명 = new ArrayList <타입 매개 변수>();
2. 주요 메서드
Boolean add(E elem): 맨 뒤에 데이터 elem 추가
void add (int idx, E elem): idx 위치에 elem 추가
Boolean addAll(Collection <? extends E> c): 컬렉션 c의 모든 요소를 맨 뒤에 추가
E get(int idx): idx 위치의 요소 리턴
E set(int idx, E elem): idx 위치의 요소를 elem으로 수정(이전 값은 리턴해줌)
void clear(): 모든 요소 삭제
E remove(int idx): idx위치 요소 삭제 (삭제하면서 리턴도 해준다)
Boolean remove (Object o): o와 동일한 요소 삭제
int size(): 저장된 요소의 개수 리턴
boolean contains (Object o): o를 포함하고 있으면 true 리턴
int indexOf(Object o): o가 저장된 인덱스 번호 리턴, 없으면 -1
boolean isEmpty(): 저장된 요소가 없으면 true
Object [] toArray(): 모든 요소를 포함한 배열 리턴
Vector <E>
: java.util.Vector 가변적 배열 구조, 동기화 지원
1. 객체 생성
Vector <타입 매개 변수> 변수 명 = new Vector <타입 매개 변수> ();
//마지막 괄호 빼먹으면 안 됨~!!!!! 그 앞까지 객체 생성. 괄호부터 생성사 호출
2. 주요 메서드
Boolean add(E elem): 맨 뒤에 추가
Void add(int idx, E elem): idx 위치에 elem 추가
E get(int idx)
E elementAT(int idx) //get이랑 기능 같음
void clear()
E remove(int idx)
Boolean remove(Object o)
E set(int idx, E elem)
int size(): 저장된 요소의 개수 리턴
int capacity(): 저장공간 크기 리턴 (기본 10개)
Object [] toArray(): 배열로 만들어 리턴
int indexOf(Object o): o의 인덱스 번호 리턴
boolean inEmpty(): 저장된 요소가 하나도 없으면 true
Iterator <E>
: java.util. Iterator
요소가 순서대로 저장된 컬렉션에서 요소를 순차적으로 검색할 때 사용하면 편함
인터페이스임. 기존에 있던 이터레이터를 얻어와서 쓰는 것.
1. 주요 메서드
boolean hasNext(): 다음에 방문할 요소가 있으면 true
E next(): 다음 요소 리턴
void remove(): 마지막으로 리턴된 요소 제거
커서가 움직이면서 값을 리턴해줌. 처음에는 10. 그다음에 n에 담아준 다음 출력. 그다음에 20, n에 담고 출력……30까지 한 다음에 마지막 false 돼서 끝남
반복자는 한번 커서 내려서 끝나면 끝임. 또 쓰려면 반복자 한번 또 얻어야 함. 04 참고.

HashMap <K, V>
: java.util.HashMap
키(key)와 값(value)의 쌍으로 구성되는 요소들을 다룬다.
K = key로 사용할 데이터 타입
V = 값으로 사용할 데이터 타입
다른 건 다 방 번호가 주어지는데 해쉬 맵은 인덱스 번호가 없다. 이건 사용자가 키 값으로 인덱스 번호 지정해줌(사용자 정의 인덱스 번호). 이터레이터(반복자)와 함께 사용하면 편하다……
데이터 저장 시, key와 값을 받아 key를 이용하여 해시 함수를 실행, 해시 함수가 리턴하는 위치에 키와 값을 저장하는 형태. index 없다 -> key로 값을 꺼냄.
반대로 데이터를 불러올 때 키를 이용하여 꺼내올 수 있다. 키를 이용하여 동일할 해쉬 함수를 실행하여서 값이 저장된 위치를 알아내어 값을 리턴해준다.
(해쉬 맵은 값이 순서대로 저장되지 않으며 사용자는 어디에 저장되어 있는지 알 수 없다. 흥미돋!)
index 중복되면 안 된다 -> key 값이 중복되면 안 된다. key 값은 유일해야 함.
장점: 벡터나 AL에 비해 삽입, 삭제, 검색 시간이 매우 빠르다.
단점: 인덱스 번호가 없어서 접근하려면 다른 방법을 써야 한다.
1. 객체 생성
HashMap <key제네릭 타입, value 제네릭 타입> 변수 명 = new HashMap <key제네릭 타입, value 제네릭 타입>();
2. 주요 메서드
V(밸류 타입으로 리턴) put(K key, V value): key, value 쌍으로 요소 하나 추가
V get(K key): key를 주고 값 꺼내기
V remove(K key): key에 해당하는 key, value 세트 삭제
int size(): 저장된 요소의 개수 (키, 밸류 세트로 알려줌)
void clear(): 전체 삭제
Set <K> keySet(): key만 모아서 Set 타입으로 리턴 // 리턴 타입은 보통 세트로 많이 해줌. 키 값 같은 거 가져올 때. 중복되면 안 되는 것들.. Set <E> -> HashSet <E>
boolean isEmpty(): 저장된 게 없으면 true
boolean containsKey(Object key): key를 포함하면 true
boolean containsValue(Object value): value를 포함하면 true
Set <E>
: set은 인터페이스. 순서가 없고, 중복 요소가 없는 컬렉션. 동일한 값 저장 불가.
Properties
: HashMap의 예전 버전인 HashTable을 상속받아 구현해놓은 클래스. 키, 밸류 형식으로 데이터 저장. K, V 모두 String으로만 처리됨. 주로 애플리케이션의 환경 설정과 관련된 정보를. properties 확장자의 파일에 저장해놓고 해당 파일을 자바 코드로 불러올 때 사용하는 클래스