안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
컬렉션이란?
- 동일한 타입을 묶어 관리하는 자료 구조
컬렉션 프레임워크란?
- 리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크
- 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음
컬렉션의 특성에 따라 구분하면 크게 List<E>, Set<E>, Map<K, V>로 나뉩니다.
메모리의 입출력 특성에 따라 기존 컬렉션 기능을 확장/조합한 Stack<E>, Queue<E>도 있습니다.(사진에선 누락)
☞ Map<K, V> 컬렉션 인터페이스
- 사진 상에도 나와있듯이, Map<K, V> 컬렉션은 상속 구조상 List<E>, Set<E>와 분리 (별도 인터페이스 존재)
- Key(키)와 Value(값)의 한 쌍으로 데이터 저장
- 한 쌍의 데이터를 '엔트리'라고 하며, Map.Entry 타입으로 정의
- 데이터를 엔트리 단위로 입력 받음
- Key값으로 Value를 가져오므로 Key 값은 중복 불가, Value 값은 중복 가능
Map<K, V>의 주요 메소드
구분 | 리턴 타입 | 메소드명 | 기능 |
데이터 추가 | V | put(K key, V value) | 입력매개변수의 (key, value)를 Map 객체에 추가 |
void | putAll(Map<? extends K, ? extends V> | 입력매개변수의 Map 객체를 통째로 추가 | |
데이터 변경 | V | replace(K key, V value) | Key에 해당하는 값을 Value 값으로 변경(old 값 리턴) (단, 해당 Key가 없으면 null 리턴) |
boolean | replace(K key, V oldValue, V newValue) | (key, oldValue)의 쌍을 갖는 엔트리에서 oldValue를 newValue로 변경 (단, 해당 엔트리가 없으면 null 리턴) |
|
데이터 정보 추출 |
V | get(Obejct key) | 매개변수의 Key 값에 해당하는 oldValue를 리턴 |
boolean | containsKey(Object key) | 매개변수의 Key 값이 포함돼 있는 지 여부 | |
boolean | containsValue(Object value) | 매개변수의 Value 값이 포함돼 있는지 여부 | |
Set<K> | keySet() | Map 데이터들 중 Key들만 뽑아 Set 객체로 리턴 | |
Set<Entry<K, V>> | entrySet() | Map의 각 엔트리들을 Set 객체로 담아 리턴 | |
int | size() | Map에 포함된 엔트리의 개수 | |
데이터 삭제 | V | remove(Object key) | 입력매개변수의 Key를 갖는 엔트리 삭제 (단, 해당 Key가 없으면 아무런 동작을 하지 않음) |
boolean | remove(Object key, Object value) | 입력매개변수의 (key, value)를 갖는 엔트리 삭제 (단, 해당 엔트리가 없으면 아무런 동작을 하지 않음) |
|
void | clear() | Map 객체 내의 모든 데이터 삭제 |
☞ HashMap<K, V>
- Key 값의 중복을 허용 하지 않음 (두 Key 객체의 equals(), hashCode()가 같아야 같은 객체로 인식)
- 입출력 순서가 동일하지 않을 수 있음
- 최고 저장 용량의 기본 값은 16, 개수가 넘어가면 자동으로 늘어남
HashMap<K, V> 인터페이스 객체 생성
Map<제네릭 타입 지정, 제네릭 타입 지정> 참조변수 = new HashMap<>(); //우항 제네릭타입은 생략 가능
HashMap<제네릭 타입 지정, 제네릭 타입 지정> 참조변수 = new HashMap<>();
Map<Integer, String> map1 = new HashMap<>();
HashMap<Integer, String> map2 = new HashMap<>();
메소드 사용해보기
데이터 추가
// 1. put(K key, V value)
map1.put(2, "나다라");
map1.put(1, "가나다");
map1.put(3, "다라마");
System.out.println(map1);
//중복 키 추가 시 Value값은 대체됨(덮어쓰기)
map1.put(3, "라라라"); //중복 key값 -> value값 덮어쓰기
System.out.println(map1); //{1=가나다, 2=나다라, 3=라라라}
// 2. putAll(<Map<? extends K,? extends V>m)
map2.putAll(map1);
System.out.println(map2);
@콘솔출력값
{1=가나다, 2=나다라, 3=다라마}
{1=가나다, 2=나다라, 3=다라마}
입력 순서와 불일치한 것을 확인할 수 있습니다.
데이터 변경
// 3. replace(K key, V value)
map2.replace(1, "가가가");
map2.replace(4, "마마마"); //존재하지 않는 Key값이므로 동작하지않음
System.out.println(map2);
// 4. replace(K key, V oldValue, V newValue)
map2.replace(1, "가가가", "나나나");
//Key = 2, Value = "마바사"인 엔트리를 변경 -> 존재하지 않으므로 동작 X
map2.replace(2, "마바사", "라라라");
System.out.println(map2);
@콘솔출력값
{1=가가가, 2=나다라, 3=다라마}
{1=나나나, 2=나다라, 3=다라마}
map2.replace(2, "마바사", "라라라")의 경우, Key 값은 2 / Value 값은 "마바사"인 엔트리 중 Value 값을 "라라라"로 변경하라! 라고 하였는데, 해당하는 엔트리가 없으므로 동작하지 않아 데이터 변경이 안되는 것을 확인할 수 있습니다.
데이터 정보 추출
// 5. V get(Object Key)
System.out.println(map2.get(1));
System.out.println(map2.get(2));
System.out.println(map2.get(3));
// 6. containsKey(Object Key)
System.out.println(map2.containsKey(1));
System.out.println(map2.containsKey(10));
// 7. containsValue(Object value)
System.out.println(map2.containsValue("나나나"));
System.out.println(map2.containsValue("룰루"));
@콘솔출력값
나나나
나다라
다라마
true
false
true
false
get() 메소드의 경우, 인덱스로 값을 불러오는 것이 아닌 Key 값으로 값을 가져오는 것입니다.
// 8. Set<K> keySet()
Set<Integer> keySet = map2.keySet();
System.out.println(keySet);
// 9. Set<Map.Entry<K, V>> entrySet()
Set<Entry<Integer, String>> entrySet = map2.entrySet();
System.out.println(entrySet);
// 10. size()
System.out.println(map2.size());
@콘솔출력값
[1, 2, 3]
[1=나나나, 2=나다라, 3=다라마]
3
keySet()은 키 값들을 모아 Set<E> 타입으로 리턴해주는 것,
entrySet()은 Map<K, V>에 포함된 모든 엔트리를 Set<E>로 가져오는 것입니다.
데이터 삭제
// 11. remove(Object key)
map2.remove(1);
map2.remove(4); //해당 key값이 없으므로 동작 X
System.out.println(map2);
// 12. remove(Object key, Object value)
map2.remove(2, "나다라");
map2.remove(3, "다다다"); //해당 value값이 없으므로 동작 X
System.out.println(map2);
//13. clear()
map2.clear();
System.out.println(map2);
@콘솔출력값
{2=나다라, 3=다라마}
{3=다라마}
{}
모든 요소 열람
// 1. keySet
Set<Integer> keySet = map.keySet();
// 1-1. for-each
for(Integer key : keySet) {
String value = map.get(key);
System.out.println("for-each : "+key + " = " + value);
}
// 1-2. iterator
Iterator<Integer> iter = keySet.iterator();
while(iter.hasNext()) {
Integer key = iter.next();
String value = map.get(key);
System.out.println("iterator : "+key + " = " + value);
}
@콘솔출력값
for-each : 100 = apple
for-each : 37 = kiwi
for-each : 123 = strawberry
for-each : 555 = avocado
iterator : 100 = apple
iterator : 37 = kiwi
iterator : 123 = strawberry
iterator : 555 = avocado
// 2. entrySet
Set<Entry<Integer, String>> entrySet = map.entrySet();
// 2-1. for-each
for(Entry<Integer, String> entry : entrySet) {
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println("for-each : " + key + " = " + value);
}
// 2-2. iterator
Iterator<Entry<Integer, String>> iter2 = entrySet.iterator();
while(iter2.hasNext()) {
Integer key = iter2.next().getKey();
String value = map.get(key);
System.out.println("iterator : " + key + " = " + value);
}
@콘솔출력값
for-each : 100 = apple
for-each : 37 = kiwi
for-each : 123 = strawberry
for-each : 555 = avocado
iterator : 100 = apple
iterator : 37 = kiwi
iterator : 123 = strawberry
iterator : 555 = avocado
커스텀 클래스 관리
public class Student {
private int no;
private String name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int no, String name) {
super();
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + "]";
}
Map<Integer, Student> studentMap = new HashMap<>();
studentMap.put(1, new Student(1, "홍길동"));
studentMap.put(2, new Student(2, "신사임당"));
studentMap.put(3, new Student(3, "세종대왕"));
studentMap.put(4, new Student(4, "이황"));
//2번 학생
Student stu = studentMap.get(2);
System.out.println(stu);
//containsKey(key):boolean
System.out.println(studentMap.containsKey(2));
//containsValue(value):boolean
System.out.println(studentMap.containsValue(new Student(5, "박채니")));
//values():Collection<V>
Collection<Student> values = studentMap.values();
System.out.println(values);
@콘솔출력값
Student [no=2, name=신사임당]
true
false
[Student [no=1, name=홍길동], Student [no=2, name=신사임당],
Student [no=3, name=세종대왕], Student [no=4, name=이황]]
'Java > Java' 카테고리의 다른 글
컬렉션/Map<K, V>) TreeMap<K, V>, 주요 메소드 (0) | 2022.04.02 |
---|---|
컬렉션/Map<K, V>) LinkedHashMap<K, V>, 주요 메소드 (0) | 2022.04.02 |
컬렉션/Set<E>) TreeSet<E>, 주요 메소드, 크기 비교 (0) | 2022.04.01 |
컬렉션/Set<E>) LinkedHashSet<E>, 주요 메소드 (0) | 2022.03.31 |
컬렉션/Set<E>) HashSet<E>, 주요 메소드, 중복 제거 (0) | 2022.03.31 |