자바칩

[자바의 신] 23장. 컬렉션 (Set과 Queue): 문제 풀이 본문

Study/Java

[자바의 신] 23장. 컬렉션 (Set과 Queue): 문제 풀이

아기제이 2024. 5. 17. 22:14
728x90

정리해 봅시다

 

1. 순서와 상관 없는 여러 데이터를 하나의 객체에 저장할 때 사용하는 Collection의 하위 인터페이스는 무엇인가요?

Set 인터페이스

 

 

2. HashSet 클래스는 생성자를 통하여 저장 가능한 데이터의 초기 크기를 지정할 수 있나요?

HashSet 클래스는 생성자를 통하여 저장 가능한 데이터의 초기 크기를 지정할 수 있다.

*사용 예시
HashSet<String> set = new HashSet<String>(100);

* 생성자 종류
생성자 설명
HashSet() 데이터를 저장할 수 있는 16개의 공간과 0.75의 로드 팩터를 갖는 객체를 생성한다.
HashSet(Collections<? extends E> c) 매개 변수로 받은 컬렉션 객체의 데이터를 HashSet에 담는다.
HashSet(int initialCapacity) 매개 변수로 받은 개수만큼의 데이터 저장 공간과 0.75의 로드 팩터를 갖는 객체를 생성한다.
HashSet(int initialCapacity, float loadFactor)   첫 매개 변수로 받은 개수만큼의 데이터 저장 공간과 두 번째 매개 변수로 받은 만큼의 로드 팩터를 갖는 객체를 생성한다.

*로드 팩터란?
로드 팩터는 (데이터의 개수) / (저장 공간) 을 의미한다. 만약 데이터의 개수가 증가하여 로드 팩터보다 커지면, 저장 공간의 크기는 증가되고 해시 재정리 작업(rehash)을 해야만 한다. 데이터가 해시 재정리 작업에 들어가면, 내부에 갖고 있는 자료 구조를 다시 생성하는 단계를 거쳐야 하므로 성능에 영향이 발생한다.
로드 팩터라는 값이 클수록 공간은 넉넉해지지만, 데이터를 찾는 시간은 증가한다. 따라서, 초기 공간 개수와 로드 팩터는 데이터의 크기를 고려하여 산정하는 것이 좋다. 왜냐하면, 초기 크기가 (데이터의 개수) / (로드 팩터) 보다 클 경우에는 데이터를 쉽게 찾기 위한 해시 재정리 작업이 발생하지 않기 때문이다. 따라서, 대량의 데이터를 여기에 담아 처리할 때에는 초기 크기와 로드 팩터 값을 조절해 가면서 가장 적당한 크기를 찾아야 한다.

 

 

3. HashSet 클래스의 객체에 데이터를 추가하는 메소드는 무엇인가요?

add(E element)

*사용 예시
HashSet<String> set = new HashSet<String>();
set.add("A");         // A 추가

 

 

4. HashSet 클래스의 객체에 어떤 데이터가 존재하는지 확인하는 메소드는 무엇인가요?

contains(Object o)

*사용 예시
HashSet<String> set = new HashSet<String>();
set.add("A");
System.out.println(set.contains("A"));      // true
System.out.println(set.contains("B"));      // false

 

 

5. HashSet 클래스의 객체에 어떤 데이터를 삭제하는 메소드는 무엇인가요?

remove(Object o)

*사용 예시
HashSet<String> set = new HashSet<String>();
set.add("A");
set.remove("A");      // A 삭제

 

 

6. Queue는 FIFO를 처리하기 위한 클래스들의 인터페이스입니다. FIFO는 무슨 단어의 약어인가요?

First In First Out (선입선출)

 

 

7. Deque는 무슨 단어의 약어이며, 용도는 무엇인가요?

Double Ended Queue
맨 앞에 값을 넣거나 빼는 작업, 맨 뒤에 값을 넣거나 빼는 작업을 수행하는 데 용이하도록 되어 있다.

 

 

8. LinkedList 클래스의 특징을 이야기해 봅시다.

데이터의 위치가 정해져 있는 ArrayList와 Vector와 달리, LinkedList는 각 데이터들이 앞에 있는 데이터와 뒤에 있는 데이터만 기억한다. 그러므로 배열의 중간에 있는 데이터가 지속적으로 삭제되고, 추가될 경우에는 LinkedList가 배열보다 메모리 공간 측면에서 유리하다. 왜냐하면 배열과 같은 ArrayList나 Vector는 맨 앞의 값을 삭제하면, 그 뒤에 있는 값들은 하나씩 앞으로 위치를 이동해야 제대로 된 위치의 값을 가지게 된다. 그에 반해 LinkedList는 중간에 있는 데이터를 삭제하면, 지운 데이터의 앞에 있는 데이터와 뒤에 있는 데이터를 연결만 하면 된다. 위치를 맞추기 위해서 값을 이동하는 단계를 거칠 필요가 없다.
또한 LinkedList는 List 인터페이스 뿐만 아니라 Queue와 Deque 인터페이스도 구현하고 있다.

직접해 봅시다

package d.collection.practice;  // 1번

import java.util.Random;        // 2번
import java.util.HashSet;

public class RandomNumberMaker {    // 1번
    public static void main(String[] args) {    // 1번
        RandomNumberMaker randomNumberMaker = new RandomNumberMaker();
        // 4번
        for (int i = 0; i < 10; i++) {
            System.out.println(randomNumberMaker.getSixNumber());
        }
    }

    // 3번
    public HashSet<Integer> getSixNumber() {
        HashSet<Integer> sixNumber = new HashSet<Integer>();
        Random random = new Random();
        while (sixNumber.size() < 6) {
            int tempNumber = random.nextInt(45);
            sixNumber.add(tempNumber);
        }
        return sixNumber;
    }
}