Java

자바 step12 - UtilClass(HashMap, Map, HashSet 객체) - 5

코딩탕탕 2022. 11. 15. 19:00

 

HashMap

package test.main;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class MainClass09 {
	public static void main(String[] args) {
		HashMap<String, String> dic=new HashMap<>();
		dic.put("house", "집");
		dic.put("phone", "전화기");
		dic.put("car", "자동차");
		dic.put("pencil", "연필");
		dic.put("eraser", "지우개");
	
		/*
		 *  검색할 단어를 입렵하세요: house
		 *  house 의 뜻은 집입니다.
		 *  
		 *  검색할 단어를 입력하세요: gura
		 *  gura 는 목록에 없습니다.
		 */
	
		Scanner scan=new Scanner(System.in);
		System.out.print("검색할 단어를 입력하세요:");
		String line=scan.nextLine();

		// 만일 HashMap 객체가 입력한 line 을 key 값으로 가지고 있다면
		if(dic.containsKey(line)) {
			System.out.println(line+"의 뜻은 "+dic.get(line)+"입니다.");
		} else {
			System.out.println(line+"은(는) 목록에 없습니다.");
		}

	}
}


<console>
검색할 단어를 입력하세요:house
house의 뜻은 집입니다.

검색할 단어를 입력하세요:gura
gura은(는) 목록에 없습니다.

HashMap 객체는 <> 안에 key, value 형식으로 들어가기 때문에 무슨 타입이 들어가는지 선언해 주어야 한다.

new HashMap<> 안은 생략 가능하다.

put() 메소드로 key, value 값을 넣을 수 있고, key값으로 value값을 호출할 수 있다.

if 문 안에 조건으로 containsKey() 메소드가 적혀있는데 이 함수는 맵에서 키 값이 있는지 확인하는 함수이다.

벨류값이 있는지 확인하는 함수로 containsValue도 있다 True, False 로 반환한다.

get() 메소드로 key값의 value값을 가져올 수 있다.

 

 

Map

package test.main;

import java.util.HashMap;
import java.util.Map;

public class MainClass10 {
	public static void main(String[] args) {
		/*
		 * 	회원정보는 숫자(int), 문자(String) 으로 구성 되어 있기 때문에
		 * 	value 의 generic 은 Object 로 지정해야 한다.
		 */
		Map<String, Object> map=new HashMap<>();
		// value 의 generic 이 Object 이기 때문에 어떤 type 이든지 담을 수 있다.
		map.put("num", 1);
		map.put("name", "김구라");
		map.put("addr", "노량진");
		
		// Object type 으로 리턴되기 때문에 원래 type 으로 casting 해주어야 한다.
		int num=(int)map.get("num");
		String name=(String)map.get("name");
		String addr=(String)map.get("addr");
	}
}


<console>

HashMap은 Map을 인터페이스를 통해 구현한 구현체로 위와 같은 형태의 객체 생성 가능하다.위의 예문을 보면 Map 객체에 저장할 타입으로서 int와 String 타입이 존재하므로 <>안에는 String(변수명 타입), Object(저장할 값의 타입) 이 들어간다.마찮가지로 put()메소드를 활용해 값을 저장하고 있다.값을 호출하여 그 값을 다시 변수명에 넣어야 할 경우에는 Object 타입으로 저장되었기 때문에 다시 원래의 타입으로 casting 해 주어야 한다. 

 

 

HashSet

package test.main;

import java.util.HashSet;
import java.util.Set;
/*
 * 	HashSet 은 Set 인터페이스를 구현한 클래스이다.
 * 	
 * 	- 순서가 없다.
 * 	- key 값도 없다.
 * 	- 중복을 허용하지 않는다.
 * 	- 어떤 data 를 묶음(집합) 으로 관리하고자 할 때 사용한다.
 */
public class MainClass11 {
	public static void main(String[] args) {
		
		Set<Integer> set1=new HashSet<>();
		set1.add(10);
		set1.add(20);
		set1.add(20);
		set1.add(30);
		set1.add(30);
		
		// 문자열을 저장할 수 있는 HashSet 객체
		Set<String> set2=new HashSet<>();
		set2.add("kim");
		set2.add("lee");
		set2.add("park");
		set2.add("lee");
		set2.add("park");
		
		System.out.println(set1);
		System.out.println(set2);
	}
}


<console>
[20, 10, 30]
[lee, kim, park]

HashSet 은 Set 인터페이스를 구현한 클래스이다. - 순서가 없다.
 - key 값도 없다.
 - 중복을 허용하지 않는다.
 - 어떤 data 를 묶음(집합) 으로 관리하고자 할 때 사용한다.

 

 

 

HashMap과 HashSet의 차이점은 크게 아래 6가지로 나눌 수 있다.

1. 정의

HashMap Map 인터페이스의 구현체로, HashTable과 유사한 자료구조로 데이터를 저장한다.

 

HashSet Set 인터페이스의 구현체로, 내부적으로 HashMap을 사용하기 때문에 HashTable과 유사한 자료구조로 데이터를 저장한다.

 

2. 데이터 저장 형태

HashMap Key-Value 쌍 형태로 데이터를 저장하며, Key와 Value의 mapping을 유지하고 있다.

 

HashSet 객체 그 자체를 저장한다.

위에서 HashMap을 내부적으로 사용한다고 했는데,

Key 값으로는 삽입되는 객체 그 자체를, Value 값으로는 HashSet 내부 구현 코드에서 미리 선언해둔 dummy 객체를 사용한다.

 

3. 중복 허용 여부

HashMap은 중복 Key 값을 허용하지 않지만, 중복 Value 값은 허용한다.

ex. {'a': 1, 'b': 1, 'c': 2}

 

HashSet은 객체 자체를 데이터로 저장하기 때문에 중복을 허용하지 않는다.

ex. {'a', 'b', 'c'}

 

4. NULL 허용 여부

HashMap (중복 Key 값을 허용하지 않기 때문에) 단 하나의 NULL 값을 Key 값으로 가질 수 있고, 여러 NULL 값을 Value 값으로 가질 수 있다.

 

HashSet 단 하나의 NULL 값을 가질 수 있다.

 

5. 데이터 삽입 방법

HashMap은 put() 메서드를 사용하여 데이터를 삽입하는데, Key-Value 쌍 데이터의 형태를 저장하기 때문에

삽입 연산 동안 단 하나의 객체가 생성된다.

 

HashSet은 add() 메서드를 사용하여 데이터를 삽입하는데,

객체 그 자체를 저장하고 내부적으로 HashMap을 사용하기 때문에 삽입되는 객체(Key값) dummy 객체(Value 값),

 두 개의 객체가 삽입 연산 동안 생성된다.

 

성능

HashMap이 HashSet보다 빠르다.

그래서 데이터의 유일함(Uniqueness)을 유지하기 위해 항상 HashMap이 HashSet보다 선호된다.

 

 

HashMap과 HashSet의 차이점 출처 : https://siahn95.tistory.com/entry/Java%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-HashMap-HashSet-%EC%9D%B4%EB%9E%80-5-HashMap-vs-HashSet#--%--%EB%-D%B-%EC%-D%B-%ED%--%B-%--%EC%--%BD%EC%-E%--%--%EB%B-%A-%EB%B-%--