내일배움캠프 13일차 TIL - 실습 회고(LinkedHashSet, Objects.equals 사용)

iy·2024년 1월 2일

TIL

목록 보기
12/37

List, Set, Map 원하는 자료구조 입력
기억나는 만큼 먹었던 점심들 입력
끝을 입력하면 기록했던 메뉴들 출력
출력시 번호 붙은 형식으로 출력
제시한 자료구조명 외의 단어 입력시 저장할 수 없음을 알리며 종료

해당 문제는 실습 문제와 비슷하게 재연

🐛 실습하면서 고민했던 부분
1. Set은 중복 값을 저장해 주지 않는데 점심 메뉴를 동일하게 먹었을 땐 어떻게 처리해 줘야 하는지
2. Set은 순서도 보장해 주지 않는데 차례대로 출력해 줄 방법이 있을지

  • 제출 답안
Scanner scan = new Scanner(System.in);

        // 자료구조명 입력
        System.out.println("저장할 자료구조를 입력하세요.(List/Set/Map)");
        String colName = scan.nextLine();

        int i = 0;
        switch (colName) {
            case "List":

                System.out.println("점심 메뉴를 기록하세요");

                ArrayList<String> list = new ArrayList<>();
                while (true) {
                    String foodName = scan.nextLine();
                    i++;
                    if (Objects.equals(foodName, "끝")) {
                        break;
                    }
                    list.add(i + ". " + foodName);
                }
                scan.close();
                System.out.println("[ " + colName + "으로 저장된 메뉴들 ]");
                for (String value : list)
                    System.out.println(value);
                break;
            case "Set":
                System.out.println("점심 메뉴를 기록하세요");
                
                Set<String> set = new LinkedHashSet<>();
                while (true) {
                    String foodName = scan.nextLine();
                    i++;
                    if (Objects.equals(foodName, "끝")) {
                        break;
                    }
                    set.add(i + ". " + foodName);
                }
                scan.close();
                System.out.println("[ " + colName + "으로 저장된 메뉴들 ]");
                for (String value : set)
                    System.out.println(value);
                break;
            case "Map":
                System.out.println("점심 메뉴를 기록하세요");

                HashMap<Integer, String> map = new HashMap<>();
                while (true) {
                    String foodName = scan.nextLine();
                    i++;
                    if (Objects.equals(foodName, "끝")) {
                        break;
                    }
                    map.put(i, i + "." + foodName);
                }
                scan.close();
                System.out.println("[ " + colName + "으로 저장된 메뉴들 ]");
                for (String value : map.values())
                    System.out.println(value);
                break;
            default:
                System.out.println("저장할 수 없는 자료구조입니다.");
        }

🐾 switch 문을 사용해 입력할 자료구조명 별로 나눴다.
앞서 고민했던 부분 중 중복은 아예 입력 시 반복문을 이용해 번호를 부여해 저장했다. 하지만 그다음 고민인 부분은 조금 더 생각을 해봐야 했다.

💡 HashSet, TreeSet, LinkedHashSet

  • HashSet : 배열과 연결이 결합된 형태
    - 추가, 삭제, 검색, 접근성 모두 뛰어남
  • TreeSet : 연결기반
    - 정렬과 범위 검색에 뛰어남
  • LinkedHashSet : HashSet에 저장 순서 유지 기능 추가


    이렇게 비교해봤을 때 TreeSet과 LinkedHashSet으로 정렬할 수 있는데
    HashSet > LinkedHashSet > TreeSet의 순서로 성능 차이를 보인다고 한다. 그래서 이번 실습에서 LinkedHashSet을 통해 문제를 풀었다.

➕ 추가로 기억했으면 하는 것
처음 문제를 풀었을 때 "끝"이라는 단어 입력시 입력을 멈추고 입력했던 값들을 출력하게 만드는 과정에서 "끝"이라는 단어와 입력 단어를

if(foodName.equals("끝"){
...
}

으로 비교했다.
그런데 답을 비교해보려고 답안을 확인해보니

if(Objects.equals(foodName,"끝"){
...
}

으로 강사님은 Objects.equals를 사용하셨다.
그래서 비교해보니

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

equals는 null값을 비교해주지 않았다. 지금 실습 문제에선 큰 문제가 되지 않았지만 나중에 예외처리를 해주지 않는다면 NullPointerException이 발생할 것이다.
Objects.equals는 null값을 포함하여 비교해준다.

String a = null;
String b = null;
String c = "가나다"

System.out.println(Objects.equals(a,b)); // true
System.out.println(Objects.equals(a,c)); // false

👀
오늘 실습하면서 기억했으면 하는 부분을 정리했다. 고민해서 해결한 부분도 있고 생각지 못했던 부분을 알게 되기도 했는데 앞으로도 고민 많이 하면서 정리하는 습관을 들여야겠다.
특히 오늘 Objects.equals는 예외 처리 방식 중 하나이기 때문에 잘 기억해둬야겠다.

0개의 댓글