본문 바로가기
Java/Java

컬렉션/Map<K, V>) HashMap<K, V>, 주요 메소드

by 박채니 2022. 4. 2.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


컬렉션이란?

- 동일한 타입을 묶어 관리하는 자료 구조

 

컬렉션 프레임워크란?

- 리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크

- 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음

 

컬렉션의 특성에 따라 구분하면 크게 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=이황]]