
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는 예외 처리 방식 중 하나이기 때문에 잘 기억해둬야겠다.