CS

[CS] 맵, 셋

펭귄코기 2022. 11. 16. 17:40

우선 이번 글에서 맵, 셋을 다루기전에 각 인터페이스의 특징을 알아보고자 한다

 

 

1. 각 인터페이스의 특징

인터페이스 구현 클래스  특징 
List LinkedList
Stack
Vector
ArrayList
 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다
Set HashSet
TreeSet
 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
Map   HashMap
TreeMap
HashTable
Properties
 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다
 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다

 

2. 맵 (Map)

- 맵은 키(Key)와 값(Value)의 쌍으로 이루어진 데이터의 집합이다

- 순서가 유지되지 않는다

- 키는 중복을 허용하지 않는다

- 값은 중복을 허용 한다

 

2-1) 맵 (Map) 종류

Hashtable

- HashMap보다는 느리지만 동기화가 지원된다

- 키와 값으로 null이 허용되지 않는다

HashMap

- 중복을 허용하지 않고 순서를 보장하지 않는다

- 키와 값으로 null이 허용된다

- Hashtable보다는 HashMap을 사용하자

 

TreeMap

- 이진 탐색 트리의 형태를 가진다

- 데이터를 정렬된 순서로 저장한다. 정렬된 상태를 유지하기 위해 시간이 다소 오래 걸린다

 

LinkedHashMap

- HashMap과 상당히 흡사하다

- 데이터를 넣을 때 입력한 Key의 순서를 지키지 않는 HashMap과 달리 Key의 순서를 보장한다

 

2-2) 맵 (Map) 메서드

new Map()

- 맵의 생성자 함수로 맵을 만들 때 사용한다

 

map.set(key, value)

- key로 value를 저장한다

 

map.get(key)

- key로 해당 value를 가져온다

 

map.has(key)

- 해당 key가 있는지 검사하고 true, false를 반환한다

 

map.delete(key)

- key에 해당하는 값을 삭제한다

 

map.clear()

- 맵 안의 모든 요소를 지운다

 

map.size()

- 요소의 개수를 반환한다

 

2-3) Hash Map 예시

// HashMap 선언
HashMap<String,String> map1 = new HashMap<String,String>();	//HashMap생성
HashMap<String,String> map2 = new HashMap<>();			//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);		//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);		//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);		//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{	//초기값 지정
    put("a","b");
}};

// HashMap 값 추가
HashMap<Integer,String> map = new HashMap<>();	//new에서 타입 파라미터 생략가능
map.put(1,"사과"); 		//값 추가
map.put(2,"바나나");
map.put(3,"포도");

// HashMap 값 삭제
HashMap<Integer,String> map = new HashMap<Integer,String>(){{		//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
map.remove(1); 		//key값 1 제거
map.clear(); 		//모든 값 제거

// HashMap 값 출력
HashMap<Integer,String> map = new HashMap<Integer,String>(){{		//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
System.out.println(map); 		//전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));		//key값 1의 value얻기 : 사과
		
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//KeySet() 활용
for(Integer i : map.keySet()){ 		//저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

 

3. 셋 (Set)

- 셋은 집합이다

- 집합에서는 중복된 데이터를 허용하지 않는다

- 즉 셋은 중복을 허용하지 않는다

- 순서가 유지하지 않는다

- 검색기능이 없어 하나씩 꺼낼 수 있는 Iterator를 제공한다

- 향상된 for문을 이용해서 더 쉽게 꺼내 올 수도 있다

- contains로 값을 찾을 수 는 있다

 

3-1) 셋 (Set) 종류

HashSet

- 순서 및 정렬을 하지 않는 가장 단순한 Set이다

- 덕분에 가장 빠른 임의 접근 속도를 가진다

 

LinkedHashSet

- HashSet과 흡사하다

- 연결 리스트를 사용해서 데이터를 저장하기 때문에 Key의 순서를 보장한다

TreeSet

- 이진 탐색 트리(레드-블랙 트리)의 형태를 가진다

- 데이터를 정렬된 순서로 저장, 정렬된 상태를 유지하기 위해 시간이 다소 오래 걸린다

- 정렬 방법을 지정할 수 있다

 

3-2) 셋 (Set) 메서드

new Set(iterable)

- 셋을 만든다

- 이 트러블 객체를 전달받으면(대게 배열을 전달 반음) 그 안의 값을 복사해 셋에 넣어 준다

 

set.add(value)

- 값을 추가하고 셋 자신을 반환한다

 

set.delete(value)

- 값을 제거한다

- 값을 지우는 데 성공하면 true를 반환합니다 아니먄 false를 반환한다

 

set.has(value)

- 셋 내의 값이 존재하면 true, false를 반환한다

 

set.clear()

- 셋을 비운다

 

set.size()

- 셋에 몇 개의 값이 있는지 세어준다

 

3-3) Hash Set 예시

// HashSet 선언
HashSet<Integer> set1 = new HashSet<Integer>();			//HashSet생성
HashSet<Integer> set2 = new HashSet<>();			//new에서 타입 파라미터 생략가능
HashSet<Integer> set3 = new HashSet<Integer>(set1);		//set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set4 = new HashSet<Integer>(10);		//초기 용량(capacity)지정
HashSet<Integer> set5 = new HashSet<Integer>(10, 0.7f);		//초기 capacity,load factor지정
HashSet<Integer> set6 = new HashSet<Integer>(Arrays.asList(1,2,3));	//초기값 지정

// HashSet 값 추가
HashSet<Integer> set = new HashSet<Integer>();		//HashSet생성
set.add(1); 		//값 추가
set.add(2);
set.add(3);

// HashSet 값 삭제
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));		//HashSet생성
set.remove(1);		//값 1 제거
set.clear();		//모든 값 제거

// HashSet 크기 구하기
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));		//HashSet생성
System.out.println(set.size());		//set 크기 : 3

// HashSet 값 출력
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));		//HashSet생성

System.out.println(set); 		//전체출력 [1,2,3]
		
Iterator iter = set.iterator();		// Iterator 사용
while(iter.hasNext()) {			//값이 있으면 true 없으면 false
    System.out.println(iter.next());
}

// HashSet 값 검색
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));		//HashSet생성
System.out.println(set.contains(1)); 		//set내부에 값 1이 있는지 check : true