반응형

## Set 컬렉션



List 컬렉션은 저장 순서를 유지하지만 Set 컬렉션은 저장 순서가 유지되지 않는다. 
또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다 Set 컬렉션은 수학의 집합에 비유될 수 있다. 
집합은 순서와 상관없고 중복이 허용되지 않기 때문이다. 
Set 컬렉션은 또한 구슬 주머니와도 같다. 
동일한 구슬을 두 개 넣을 수 없고, 들어갈(저장할) 때의 순서와 나올(찾을) 때의 순서가 다를 수도 있기 때문이다.
                         

Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있는데, 
다음은 Set 컬렉션에서 공통적으로 사용 가능한 Set 인터페이스의 메소드들이다. 
인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드가 없다.
                    

위 표에서 메소드의 매개 변수 타입과 리턴 타입에 E라는 타입 파라미터가 있는데,
이것은 Set 인터페이스가 제네릭 타입이기 때문이다. 
구체적인 타입은 구현 객체를 생성할 때 결정된다. 
객체 추가는 add() 메소드를 사용하고, 객체 삭제는 remove() 메소드를 사용한다. 

다음은 Set 컬렉션에 저장되는 구체적인 타입을 String으로 정해놓고,
String 객체를 저장하고 삭제하는 방법을 보여준다.

Set<String> set = ...;
set.add("흥길동");
set.add ( “신용권" ); 
set.remove ("홍길동");



Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 
대신, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다. 
반복자는 Iterator 인터페이스를 구현한 객체를 말하는데. Iterato() 메소드를 호출하면 얻을 수 있다.


Set<String> set = ...;
lterator<String> iterator = set.iterator();

 

 

 

 

- 여기서 hasNext() 메서드는 set안에서 가져올 수 있는 객체가 있는지 확인을 한다.

- Iterator에서 객체를 하나씩 가져올 때는 next() 메서드를 사용한다.



Iterator에서 하나의 객체를 가져올 때는 next () 메소드를 사용한다. 
next() 메소드를 사용하기 전에 먼저 가져올 객체가 있는지 확인하는 것이 좋다. 
hasNext() 메소드는 가져올 객체가 있으면 true를 리턴하고 더 이상 가져올 객체가 없으면 false를 리턴한다. 
따라서 true가 리턴될때 next() 메소드를 사용해야 한다. 

다음은 Set 컬렉션에서 String 객체들을 반복해서 하나씩 가져오는 코드를 보여준다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator(); 
while(iterator.hasNext ())  {
//String 객채 하나 꺼낸다.
String str =  iterator.next();  
}




Iterator를사용하지 않더라도 향상된 for문을 이용해서 전체 객체를 대상으로 반복할수 있다.

Set<String> set = ...;
for(String str : set) {
}




Set 컬렉션에서 Iterator의 next() 메소드로 가져온 객체를 제거하고 싶다면 remove() 메소드를 호출하면 된다. 
Iterator의 메소드이지만, 실제 Set 컬렉션에서 객체가 제거됨을 알아야 한다. 

다음은 Set 컬렉션에서 “홍길동”을 제거한다.

 

while(iterator.hasNext()) { 
String str = iterator.next();
if(str.equals("흥길동")) {
iterator.remove () ;
}
}




## HashSet

 

//												  new HashSet<>() <- 순서없이 추출
Set<Integer> lottoSet = new TreeSet<Integer>();		// <- (오름차순) 정렬이 되서 추출이 된다.

// 난수관리객체 (F4를 누르면 메서드 목록이 나온다)
Random random = new Random();


int count = 6;
while(count>0) {
    // 수행
    //System.out.println(count);
    // 1~45 난수발생
    int num = (random.nextInt(45)+1);	// nextInt(n) : 0 ~ (n-1)
    //System.out.println(num);
    if(lottoSet.add(num) == false) continue; // 현재명령종료 다음제어식으로 이동해라
    count --;
}

System.out.println(lottoSet);


HashSet은 Set 인터페이스의 구현 클래스이다. 
HashSet을 생성하기 위해서는 다음과 같이 기본 생성자를 호출하면 된다.

Set<E> set = new  HashSet <E>();



타입 파라미터 E에는 컬렉션에 저장할 객체 타입을 지정하면 된다. 
예를 들어 String 객체를 저장하는 HashSet은 다음과 같이 생성할 수 있다.

Set<String> set = new HashSet<String>();



HashSet은 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. 
HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지는 않는다. 
HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다. 
그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 
만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 
true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

 


 
문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 
다른 문자열을 갖는 String 객체는 다른 객체로 간주되는데, 
그 이유는 String 클래스가 hashCode()와 equals() 메소드를 재정의해서 
같은 문자열일 경우 hashCode()의 리턴값을 같게, equals() 의 리턴값은 true가 나오도록 했기 때문이다. 


 

 

 

 

 

## Map 컬렉션

 

 

- 특징

- 키(key)와 값(value)으로 구성된 Map.Entry 객체를 저장하는 구조

- 키와 값은 모두 객체

- 키는 중복될 수 없지만 값은 중복 저장 가능

 

- 구현 클래스

- HashMap, Hashtable, LinkedHashMap, Properties, TreeMap

 



Map 컬렉션은 키 (key) 와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다.   
여기서 키와 값은 모두 객체이다. 
키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 
만약 기존에 저장된 키와 통일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.
                     


Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다. 
다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드들이다. 
키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많다.
                 
                 

위 표에서 메소드의 매개 변수 타입과 리턴 타입에 K와 V라는 타입 파라미터가 있는데,
이것은 Map 인터페이스가 제네릭 타입이기 때문이다. 
앞에서도 언급했듯이 구체적인 타입은 구현 객체를 생성할 때 결정된다.

 

- containsKey : 주어진 키가 있는지 여부

 

 

- 이 아래의 행위를 하는 이유는 Map 안에 있는 키와 값을 가져오기 위해서이다.

- map.keySet() 사용

 

 

- map.entrySet()을 사용해서 키와 값 가져오기


 
객체 추가는 put() 메소드를 사용하고, 키로 객체를 찾아올 때에는 get() 메소드를 사용한다. 
그리고 객체 삭제는 remove() 메소드를 사용한다.

Map<String, Integer> map = ~;
map.put("홍길동", 30); //객제 추가 
int score = map.get("홍길동"); //객체 찾기
map.remove("홍길동"); //객체 삭제




키를 알고 있다면 get() 메소드로 간단하게 객체를 찾아오면 되지만, 
저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우에는 두 가지 방법을 사용할 수 있다.

첫 번째는 keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 
반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻으면 된다.


Map<K, V> map   = ~;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator(); 
while(keyIterator.hasNext()) {
K key = keyIterator.next();
V value = map.get(key);
  }





두 번째 방법은 entrySet() 메소드로 모든 Map.Ently를 Set 컬렉션으로 얻은 다음, 
반복자를 통해 Map.Entry를 하나씩 얻고 getKey() 와 getValue() 메소드를 이용해 키와 값을 얻으면 된다.

Set<Map.Entry<K, V>> entrySet = map.entrySet();
Iterator<Map.Entry<κ V>> entrylterator = entrySet.iterator(); 
while(entryIterator.hasNext())  {
Map.E ntry<K, V> entry = entrylterator.next();
K key = entry.getKey(); 
V value = entry.getValue();
}







# HashMap

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. 
HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야한다. 
동등객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴값이 같이야 하고, equals() 메소드가 true를 리턴해야 한다.
                

주로 키 타입은 String을 많이 사용하는데, String은 문자열이 같을 경우 동등 객체가 될 수 있도록
hashCode()와 equals() 메소드가 재정의되어 있다. 
HashMap을 생성하기 위해서는 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 된다.
                

카와 값의 타입은 기본 타입 (byte , short, int, float, double, boolean, char)을사용할 수 없고 
클래스 및 인터페이스 타입만 가능하다. 
키로 String 타입을 사용하고 값으로 Integer 타입을 사용하는 HashMap은 다음과 같이 생성할 수 있다.

Map<String, Integer> map = new HashMap<String, Integer>();

 






# Hashtable

반응형

'java(2)↗' 카테고리의 다른 글

java 요약노트  (0) 2024.05.08
java 보충수업  (0) 2024.05.07
java 컬렉션 프레임워크(List)  (0) 2024.05.03
java 제네릭  (0) 2024.05.03
java 멀티 스레드  (0) 2024.05.02