본문 바로가기

IT

20. 자바 - set, Map 컬렉션

실무에서 list와 map은 많이 사용되기 때문에 잘 알고있으면 좋다.

 

* set : 중복객체 저장 x , 저장 순서 보장 x

순서와 상관없이 저장하므로 list보다 저장 속도는 빠르지만 원하는 값을 찾을때는 느리다.

 

set개열 컬렉션

- set 컬렉션은 저장 순서를 보장하지 않으며 객체의 중복 저장을 허용하지 않는다.

- set 컬렌션은 인덱스로 관리하지 않으며 들어갈 때의 순서와 나올때의 순서가 다를 수도 있다.

- set 컬렉션은 인덱스로 객체를 검색하는 기능이 없고 전체 객체를 대상으로 한번씩 반복하여 객체의 값을 가져오는 반복자(lterator)를 제공한다.

- 반복자는 lterator인터페이스를 구현한 객체를 의미하며 이 객체는 Set 인터페이스의 Iterator() 메서드를 호출하여 객체를 얻을 수 있다. 

 

- Iterator 인터페이스의 주요 메서드 

1.hasNext() : 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴.

2.next() : 컬렉션에서 하나의 객체를 가져옴.

3. remove() : set 컬렉션에서 객체를 제거함.

 

* set 계열 컬렉션 주요 메서드

- 객체 추가 기능 

1. add(E,e) : 주어진 객체를 저장, 성공적으로 저장되면 true를 리턴, 중복 객체를 저장하면 false를 리턴.

 

- 객체 검색 기능

1. contains(Object o) : 주어진 객체가 저장되어 있는지의 여부를 판단

2. isEmpty() : 저장된 객체를 한번씩 가져오는 반복자 객체를 리턴.

3. iterator() : 저장된 객체를 한번씩 가져오는 반복자 객체를 리턴

4. size() : 저장되어 있는 전체 객체 수를 리턴

 

- 객체 삭제 기능

1. clear() : 저장된 모든 객체를 삭제

2. remove(Object o) : 주어진 객체를 삭제

 

package collection.set;

import java.util.*;

public class HashSetExample {

	public static void main(String[] args) {
		
		Set<String> set = new HashSet<>();
		
		//set에 객체를 추가 add()
		set.add("닭강정");
		set.add("만두");
		set.add("피자");
		set.add("싸이버거");
		set.add("피자");
		
		//set에 저장된 객체의 수를 알아보는 메서드 size()
		// 현재 피자가 중복이 되어있다. set은 중복허용 안함. 그래서 사이즈가 4로 출력된다.
		System.out.println("set에 저장된 객체 수: " + set.size()); //set에 저장된 객체 수: 4
		System.out.println(set);
		
		/*
		 -set의 객체 데이터를 사용하려면 반복자(Iterator)를 통해 모든 객체를 대상으로 한번씩 반복해서 꺼내야한다.
		 */
		Iterator<String> iter = set.iterator(); //반복 객체를 만들어줘야한다.
		/*String s = iter.next();
		System.out.println(s);
		s = iter.next();
		System.out.println(s);
		s = iter.next();
		System.out.println(s);
		이런식으로 할경우 코드가 너무 길어진다. 때문에 아래와 같은 방법으로 코딩해준다.*/
		
		
		/*
		 - 반복자 객체가 next()메서드를 통해 set내부의 데이터를 반복소진할 때 더 이상 조회할 데이터가 없으면 예외를 발생시키기 때문에
		 hasNext()를 통해 더 이상 소모할 데이터가 있는지의 유무를 체크한다.
		 */
		while(iter.hasNext()) {
			String s = iter.next();
			if(s.equals("닭강정")) {
				System.out.println(s + "맛있지요");
				break;
			}
		}
		
		//set의 데이터 삭제 기능 remove(), clear()
		set.remove("단무지");
		System.out.println(set);
		
		set.clear();
		
		if(set.isEmpty()) {
			System.out.println("set이 비어있음.");			
		}else {
			System.out.println("set이 비어있지 않음");
		}
		
	}
}
----결과-----
set에 저장된 객체 수: 4
[만두, 닭강정, 싸이버거, 피자]
닭강정맛있지요
[만두, 닭강정, 싸이버거, 피자]
set이 비어있음.

 


* HashSet

- HashSet 클래스는 Set인터페이스를 구현한 컬렉션이므로 저장된 객체의 순서를 보장하지 않고 중복을 허용하지 않는다.

- HashSet을 사용하면 많은 양의 데이터를 관리할 때 추가/삭제/검색 등에 있어서 순차적으로 데이터를 관리하는 것에 비해서 속도가 향상된다.

 


* Map : key, value 쌍을 가진 Entry 객체로 데이터를 저장.

        비전형 데이터 저장 시 유용.

 

*Map 계열 컬렉션

- Map컬렉션은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고있다.

- 키는 중복저장 될 수 없지만 값은 중복 저장될 수 있다.

 

* Map 계열 주요 메서드

- 객체 추가 기능

1. put(K, key, V value) : 주어진 키와 값을 축, 정상적으로 저장도면 그 값을 리턴

 

- 객체 검색 기능

1. containKey(Object Key) : 주어진 키가 있는지의 여부를 확인

2 containsValue(Object value) : 주어진 값이 있는지의 여부를 확인

3 get(Object key) : 주어진 키에 들어있는 값을 리턴

4 isEmpty() : 컬렉션이 비어있는지의 여부를 확인

5 size() : 저장된 키의 총 수를 리턴

6 value() : 저장된 모든 값을 컬렉션에 담아서 리턴

7 keySet() :저장된 모든 키를 set객체에 담아서 리턴

8 entrySet(): 키와 값의 쌍으로 구성된 모든 entry객체를 set에 담아서 리턴

 

- 객체 삭제 기능

1. clear() : 모든 entry를 삭제

2. remove(Object Key) : 주어진 키와 일치하는 entry객체를 삭제

 


package collection.map;

import java.util.*;

public class HashMapExample {

	public static void main(String[] args) {
		
		// map은 우리가 키도 만들어줘야한다 그래서 키와 값 2개의 제너럴을 준다.
		Map<String, Integer> map = new HashMap<>();
				
		//map에 객체를 저장 put(Key, Value)
		map.put("치킨", 20000);
		map.put("라면", 2000);
		map.put("족발", 30000);
		//중복 key를 통해 put을 사용하면 value가 수정됨.
		map.put("라면", 3000); 
		
		System.out.println(map);
		
		//map에 저장된 총 Entry객체 수 얻기 size()
		System.out.println("map에 저장된 총 객체 수: " + map.size());
		
		//map에 저장된 Value값 얻기 get(key)
		int price = map.get("족발");
		System.out.printf("족발의 가격: %d원\n", price);
		
		//map에서 key를 전부 추출하는 메서드 keySet()
		Set<String> kSet = map.keySet();
		System.out.println(kSet);
		
		Iterator<String> kIter = kSet.iterator();
		System.out.println("----------------------");
		
		while(kIter.hasNext()) {
			String foodName = kIter.next();
			int foodPrice = map.get(foodName);
			System.out.printf("%s의 가격은 %d원입니다.\n",
					foodName, foodPrice);
		}
		
		//map내부에 있는 key의 유무를 확인하는 메서드 containsKey()
		String food = "감자";
		
		if(map.containsKey(food)) {
			System.out.println(food + "의 가격은 " 
					+ map.get(food));
		} else {
			System.out.println(food + "는 없는 메뉴입니다.");
		}
		
		//map 내부 데이터 삭제 remove(key)
		//해당 key에 대응하는 Entry객체를 삭제.
		map.remove("치킨");
		System.out.println(map);
		
		map.clear();
		
		if(map.isEmpty()) {
			System.out.println("map이 비어있음");
		}else {
			System.out.println("map이 비어있지 않음");			
		}
		
	}

}
-----------결과---------------
{족발=30000, 치킨=20000, 라면=3000}
map에 저장된 총 객체 수: 3
족발의 가격: 30000원
[족발, 치킨, 라면]
----------------------
족발의 가격은 30000원입니다.
치킨의 가격은 20000원입니다.
라면의 가격은 3000원입니다.
감자는 없는 메뉴입니다.
{족발=30000, 라면=3000}
map이 비어있음