본문 바로가기

Java

Set / Map / Iterator

이번엔 컬렉션 프레임워크 중에서 Set , Map, HashMap에 대해 알아보겠습니다.

 

1. Set

  • 순서를 보장하지 않는다. -> 인덱스로 객체를 가져오는 get()메서드가 없다.
  • 중복 저장이 불가하다.
  • Set을 상속받아 구현한 HashSet, TreeSet 등이 있다.
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("A");

for(String item : set){
   System.out.print(item); // AB
}

set.contains("A"); // true

set.size(); // 2

set.isEmpty(); // false

set.remove("A"); // [B]

set.clear(); // []

 

* TreeSet은 내부적으로 이진 검색 트리를 사용하여 요소를 저장하기 때문에 요소가 자연 순서 또는 제공된 비교기(comparator)에 따라 정렬됩니다. 

Set<String> set = new TreeSet<>();
set.add("B");
set.add("A");
set.add("A");

for(String item : set){
   System.out.print(item); // AB
}

 

* new Set은 안되나요? Set은 인터페이스로 직접 new Set()으로 인스턴스화 할 수 없고 구현된 클래스를 사용해야 합니다.

 

선언과 동시에 초기화도 가능합니다.

 // Java 9 이전 버전
 Set<String> set = new HashSet<>(Arrays.asList("A", "B", "C"));
 
 // Java 9 이후 버전
  Set<String> set = Set.of("A", "B", "C");

 

2. Map

  • 키(key)와 값(value)으로 구성된 객체를 저장하는 자료구조.
  • 키는 중복으로 저장할 수 없으며 하나의 키에 하나의 값만 매핑 가능
  • key를 통해 값을 얻음
  • 구현 클래스로는 HashMap , TreeMap 등이 있다.
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);

for(Map.Entry<String, Integer> entry : map.entrySet()){
   System.out.println(entry.getKey() + ":" entry.getValue()); 
}

// A : 1
// B : 2

map.containsKey("A"); // true

map.containsValue(1) // true

map.remove("A"); // {B-2}

Collection<Integer> values = map.values(); [1,2]

Set<String> keys = map.keySet(); // [A,B]

map.size(); // 2

map.isEmpty(); // false

map.clear(); // {}

 

* HashMap은 순서가 보장되지 않고, 키와 값으로 null을 허용하지만 TreeMap은 순서가 보장되며 키와 값으로 null을 허용하지 않습니다.

 

3. Iterator

  • 컬렉션의 요소를 순차적으로 접근하는 데 사용되는 인터페이스
  • ArrayList, HashSet, HashMap 등에서 제공하여 요소 순회
  • boolean hasNest() - 반복자가 순회할 다음 요소가 있으면 true, 없으면 false
  • E next() - 다음 요소 반환, 없으면 예외 발생
  • void remove() - 반복자의 현재 위치 요소 제거 next() 호출 후에만 사용 가능
Set<String> set = new TreeSet<>();
set.add("B");
set.add("A");

Iterator<String> iterator = set.iterator();

while(iterator.hasNext()){
   String item = iterator.next();
   System.out.print(item); // BA
}

 

어? for-each가 더 간단한거 같은데요? 맞아요. 근데 결국 for-each도 Iterfator를 간편하게 사용하기 위해 제공되는 루프 구조입니다. 

'Java' 카테고리의 다른 글

(spring) Exception 이녀석........  (0) 2024.06.18
Logger 딱 대  (2) 2024.06.17
익명 클래스 / 람다식 / 메소드 참조  (1) 2024.06.08
형 변환 / valueOf() / stream  (0) 2024.06.07
String / StringBuilder / StringBuffer  (1) 2024.06.07