자바칩

[자바의 신] 24장. 컬렉션 (Map): 문제 풀이 본문

Study/Java

[자바의 신] 24장. 컬렉션 (Map): 문제 풀이

아기제이 2024. 5. 18. 20:50
728x90

정리해 봅시다

 

1. Map 형태의 자료 구조는 무엇과 무엇으로 구성되어 있나요?

키(Key), 값(Value)

자료구조 특징
List - 목록 관리
- Collection 인터페이스 확장
- 순서 중요 (배열처럼 인덱스 위치 사용)
Set - 목록 관리
- Collection 인터페이스 확장
- 순서 상관 X
- 데이터 중복 X
Queue - 목록 관리
- Collection 인터페이스 확장
- 순서 중요 (맨 처음과 맨 마지막 위치 접근)
Map - 키(Key)-값(Value) 쌍 데이터 관리
- Collection 인터페이스 확장 X. 별도의 인터페이스
- 순서 상관 X
- 키 중복 X, 값 중복 O

 

 

2. Map에서 데이터를 저장하는 메소드는 무엇인가요?

put(K key, V value)

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1);    // 키: "A", 값: 1

 

 

3. Map에서 특정 키에 할당된 값을 가져오는 메소드는 무엇인가요?

get(K key)

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1);
System.out.println(map.get("A"));       // 1
System.out.println(map.get("B"));       // null

 

 

4. Map에서 특정 키와 관련된 키와 데이터를 지우는 메소드는 무엇인가요?

remove(K key)

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1);
map.remove("A");    // 키가 "A"인 키-값 데이터 쌍 삭제

 

 

5. Map에서 키의 목록을 가져오는 메소드는 무엇인가요?

keySet()

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
Set<String> keySet = map.keySet();    // 키의 목록을 Set 객체로 리턴
for (String key : keySet) {
    System.out.println(key + " = " + map.get(key);     // key: 키, map.get(key): 값
}

 

 

6. Map에 저장되어 있는 데이터의 크기를 가져오는 메소드는 무엇인가요?

size()

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.size());     // 2

 

 

7. HashMap과 Hashtable 중에서 키나 값에 null을 저장할 수 있는 것은 무엇인가요?

HashMap

 

 

8. HashMap과 Hashtable 중에서 여러 쓰레드에서 동시에 접근해도 문제가 없는 것은 무엇인가요?

Hashtable

 

 

*7, 8번과 같은 차이가 생긴 이유

자바에 Collection이라는 인터페이스가 추가된 것은 JDK 1.2부터다. 따라서, HashMap과 TreeMap이라는 클래스도 이 때 만들어져 사용되고 있다. 게다가, LinkedHashMap이라는 클래스는 JDK 1.4에서 추가되었다. 그런데, Hashtable이라는 클래스는 JDK 1.0부터이다. 즉, 만들어진 Map에 맞추어 보완되었다고 보면 된다.

Hashtable을 제외한 Map으로 끝나는 클래스들을 여러 쓰레드에서 동시에 접근하여 처리할 필요가 있을 때에는 다음과 같이 선언하여 사용해야 한다.

Map m = Collections.synchronizedMap(new HashMap(...));

자바 기본 API 중에서 JDK 1.0부터 제공되는 Hashtable, Vector는 클래스가 쓰레드에 안전하게 개발되어 있다. 그 외의 JDK 1.2부터 제공되는 대부분의 Collection 관련 클래스들은 이와 같은 처리를 해야하거나 이름에 Concurrent가 포함되어 있어야만 쓰레드에 안전하게 사용할 수 있다. 예를 들면 ConcurrentHashMap, CopyOnWriteArrayList 등이 있으며, java.util.concurrent 패키지 소속이다.

 

 

9. HashMap에서  특정 키가 존재하는지 확인하는 메소드는 무엇인가요?

containsKey(K key)

*사용 예시
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 1); 
System.out.println(map.containsKey("A"));    // true
System.out.println(map.containsKey("B"));    // false

 

 

10. 이 장에서 살펴본 클래스 중, 키가 저장되면서 정렬되는 Map에는 어떤 것이 있나요?

TreeMap

TreeMap이 키를 정렬하는 것은 SortedMap이라는 인터페이스를 구현했기 때문이다. SortedMap을 구현한 클래스들은 모두 키가 정렬되어 있어야만 한다. 키가 정렬이 되었을 때의 장점은, 가장 앞에 있는 키(firstKey()), 가장 뒤에 있는 키(lastKey()), 특정 키 뒤에 있는 키(higherKey()), 특정 키 앞에 있는 키(lowerKey()) 등을 알 수 있는 메소드를 제공해 준다는 것이다. 이러한 기능들은 키를 검색하는 프로그램을 작성할 때 매우 도움이 된다.

 

 

11. Properties 클래스는 어떤 클래스를 확장한 것인가요?

Hashtable

자바에서는 시스템의 속성을 Properties 클래스를 사용하여 제공한다.

 

 

12. Properties 클래스의 객체에 있는 데이터를 파일로 저장할 때에는 어떤 메소드들을 사용하면 되나요?

메소드 설명
store(OutputStream out, String comment) 파일에 속성을 저장한다.
store(Writer writer, String comment)
storeToXML(OutputStream os, String comment) XML로 구성되는 속성 파일을 생성한다.
storeToXML(OutputStream os, String comment)

직접해 봅시다

package d.collection.practice;  // 1번

// 2번
import java.util.Hashtable;
import java.util.Random;
import java.util.Set;

public class RandomNumberStatistics {   // 1번
    private final int DATA_BOUNDARY = 50;   // 3번
    private Hashtable<Integer, Integer> hashtable = new Hashtable<Integer, Integer>();  // 4번

    public static void main(String[] args) {    // 1번
        RandomNumberStatistics statistics = new RandomNumberStatistics();
        statistics.getRandomNumberStatistics(); // 9번
    }

    // 5번
    public void getRandomNumberStatistics() {
        Random random = new Random();
        for (int loop = 0; loop < 5000; loop++) {
            int tempNumber = random.nextInt(1, DATA_BOUNDARY + 1);
            putCurrentNumber(tempNumber);
        }
        printStatistics();  // 8번
    }

    // 6번
    public void putCurrentNumber(int tempNumber) {
        if (!hashtable.containsKey(tempNumber)) {
            hashtable.put(tempNumber, 1);
        } else {
            hashtable.put(tempNumber, hashtable.get(tempNumber) + 1);
        }
    }

    // 7번
    public void printStatistics() {
        Set<Integer> keySet = hashtable.keySet();
        for (int key : keySet) {
            System.out.print(key + "=" + hashtable.get(key) + "\t");
            if (key % 10 - 1 == 0) {
                System.out.println();
            }
        }
    }
}