hayu's 개발 일지

99클럽 코테 스터디 1일차 TIL + HashSet 본문

자료구조&알고리즘

99클럽 코테 스터디 1일차 TIL + HashSet

hayu00 2024. 5. 21. 21:00

학습 키워드

- HashSet

 

공부한 내용

HashSet

  • HashSet은 Set 인터페이스에서 지원하는 구현 클래스이다. → Set의 특징을 상속받는다.
  • Set 은 Key의 중복을 허용하지 않고, 키로 null을 허용하지 않는다. 순서 없이 Key로만 데이터를 저장한다. / 만약, 요소의 저장 순서를 유지해야한다면 LinkedHashSet 클래스를 사용하면 된다.
  • 여기에서 Key는 요소를 말한다.
  • Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 것이다.
  • Set은 비선형 구조이기 때문에 순서가 없다. 즉, 인덱스가 존재하지 않는다. 값을 추가하거나 삭제할 때는 그 값이 Set 내부에 있는지 검색 후에 추가하거나 삭제를 해야하기 때문에 List 구조에 비해 속도가 느리다.

HashSet 변수 선언

HashSet<데이터타입> set = new HashSet<데이터 타입(생략 가능)>();

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

HashSet 의 장점

  • 효츌적이고 빠른 성능 : HashSet은 요소 추가, 제거 및 검색과 같은 기본 작업에 대해 일정한 시간 복잡도를 제공한다.
  • 중복되지 않는 요소 : HashSet은 중복 요소를 포함하지 않는다.
  • 유연성 : HashSet은 사용자 정의 클래스를 포함하여 모든 유형의 객체를 저장할 수 있다.
  • 순서 유지 x : HashSet은 요소가 추가되는 순서를 유지하지 않는다.

HashSet 메서드

데이터 추가 - add()

  • HashSet은 중복 요소를 허용하지 않으므로 동일한 요소를 다시 추가하려고 하면 무시된다.
 HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");
        set.add("Apple");

        System.out.println(set);
        // 출력 : [Apple, Orange, Banana]

데이터 삭제 - remove()

  • 요소 제거 메서드이다.
HashSet<String> set1 = new HashSet<>();
        set1.add("Apple");
        set1.add("Banana");
        set1.add("Orange");

        set1.remove("Banana");

        System.out.println(set1);
        // 출력 : [Apple, Orange]

크기 구하기 - size()

     HashSet<String> set2 = new HashSet<>();
        set2.add("Apple");
        set2.add("Banana");
        set2.add("Orange");

        System.out.println("set2의 크기 : " + set2.size());
        //출력 : set2의 크기 : 3

데이터 포함 여부 확인 - contains()

  • set에 값이 포함되어 있는지 확인한다. true/false를 반환한다.
    HashSet<String> set1 = new HashSet<>();
        set1.add("Apple");
        set1.add("Banana");
        set1.add("Orange");

        set1.remove("Banana");

        System.out.println(set1);
        System.out.println("Apple을 포함하나요?" + set1.contains("Apple"));
        System.out.println("Banana를 포함하나요?" + set1.contains("Banana"));
        // 출력 : [Apple, Orange]
        // 출력 : Apple을 포함하나요?true
        // 출력 : Banana를 포함하나요?false

데이터 전체 출력 - toString()

  • toString 메서드를 통해 전체 값을 출력할 수 있다. 그리고 HashSet은 값을 하나씩 꺼낼 수 없기 때문에 for, iterator를 사용하여 하나씩 꺼낸다.
        HashSet<String> set2 = new HashSet<>();
        set2.add("Apple");
        set2.add("Banana");
        set2.add("Orange");

        //toString 사용
        System.out.println(set2.toString());
        
        //출력 : [Apple, Orange, Banana]

        //for문 사용
        for (String element : set2) {
            System.out.print(element + "  ");
        }
        System.out.println();

        //출력 : Apple  Orange  Banana 

        //iterator 사용
        Iterator<String> iterator = set2.iterator();

        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "  ");
        }

        //출력 : Apple  Orange  Banana 

 

회고

발생한 문제

- 코딩 문제를 풀다가 HashSet에 대한 공부가 부족했음을 깨닫게 되었다. 그래서 이번 기회에 HashSet을 공부해보았다.

 

해결 방법

- HashSet에 대한 개념부터 사용 메서드까지 공부하여 정리해보았다. 

 

알게된 내용

- 중복이 안되는 경우에 사용하면 좋은 자료구조라는 생각이 들었다. 순서가 없어서 검색에서는 시간이 List보다 많이 든다는 것도 알게 되었다. 

 

추후 학습할 내용

- 또 다른 자료구조 공부를 할 생각이다. 아직 공부할 부분이 많아서 무엇을 먼서 공부할지 고민이다. 

 

 

참고 자료

- https://seasome1.com/%ec%9e%90%eb%b0%94-hashset/

- https://kadosholy.tistory.com/119

 

 

'자료구조&알고리즘' 카테고리의 다른 글

99클럽 코테 스터디 3일차 TIL + Vector  (0) 2024.05.23
99클럽 코테 스터디 2일차 TIL + Hash  (0) 2024.05.22
[TIL]240518 LinkedList  (0) 2024.05.18
[TIL]240517 ArrayList 메서드  (0) 2024.05.17
[TIL]240516 ArrayList  (0) 2024.05.16