🔫 키오스크 과제를 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.
오늘은 과제를 제출하기 전 전체적으로 코드를 확인하고 요구사항에 맞게 개발되었는지 검증하는 통합테스트를 진행한 후 사용자 편의성이나 세세한 부분에서 놓친 것을 확인하여 반영하였다.
영문자를 입력받는 경우 두 문자열을 대소문자 구분없이 비교하고 동일하면 true, 다르면 false로 반환하는 메서드

private boolean removeItem(String name) {
// 입력값 대소문자 구분 없이 비교
return cartItems.keySet().removeIf(item -> item.getName().equalsIgnoreCase(name));
}
메뉴명을 입력 받아 장바구니 안의 품목을 삭제하는 removeItem() 에 적용했다.
문자열 비교를 할 때 무의식적으로 equals()를 사용하는데 입력값이 영문자라면 equals()를 사용할지, equalsIgnoreCase()를 사용할지 고민해보자.
▶︎ Cart.selectDiscount(): 사용자 유형에 맞는 할인율 적용하여 총 금액을 계산하는 메서드
private BigDecimal selectDiscount(BigDecimal totalPrice) {
Scanner sc = new Scanner(System.in);
System.out.println("\n할인 정보를 입력해주세요.");
for (int i = 0; i < UserType.values().length; i++) {
System.out.printf(i + 1 + ". %-6s : %3d%%%n"
, UserType.values()[i].getDefinition()
, UserType.values()[i].getDiscountPercent());
}
String input = sc.next();
return switch (input) {
case "1" -> VETERAN.discount(totalPrice);
case "2" -> SOLDIER.discount(totalPrice);
case "3" -> STUDENT.discount(totalPrice);
case "4" -> COMMON.discount(totalPrice);
default -> throw new IllegalStateException("유효하지 않은 입력입니다. : " + input);
};
}
지난 과제인 계산기 과제에서 Enum을 사용하여 switch문을 없앴는데 이번에도 Enum을 활용하여 코드를 간결화해보자.

사용자 유형은 출력되는 순서가 위와 같이 정해져있다.
즉, UserType 이 순서에 대한 데이터를 가지고 있다면 input과 바로 비교해도 되지 않을까?

👉 UserType 에서 index를 관리하도록 수정하였다. 그리고 index로 UserType 상수를 반환받을 수 있는 메서드를 추가하였다.
// index로 조회된 사용자 유형(Enum)을 반환하는 메서드
public static UserType getUserType(String index) {
for (UserType userType : UserType.values()) {
if (userType.index.equals(index)) {
return userType;
}
}
throw new IllegalStateException("유효하지 않은 입력입니다. : " + index);
}
// 사용자 유형에 맞는 할인율 적용하여 총 금액 계산
private BigDecimal selectDiscount(BigDecimal totalPrice) {
Scanner sc = new Scanner(System.in);
System.out.println("\n할인 정보를 입력해주세요.");
for (int i = 0; i < UserType.values().length; i++) {
System.out.printf(i + 1 + ". %-6s : %3d%%%n"
, UserType.values()[i].getDefinition()
, UserType.values()[i].getDiscountPercent());
}
return UserType.getUserType(sc.next()).discount(totalPrice);
}
switch문을 없어지고 UserType의 discount 결과를 바로 반환할 수 있게 되었다.
추후 새로운 사용자 유형이 추가되더라도 UserType만 수정하면 된다!
클래스의 필드, 메서드를 외부에서 호출하지 않고 내부에서만 사용한다면 public이 아닌 private로 외부 호출을 막는다.
해당 필드와 메서드가 어디에서 호출되고 있는지 확인하려면 Hierarchy(계층)을 확인하면 된다.
⌨️ IntelliJ
Hierarchy
필드명·메서드명을 포커싱한 다음⌃(control)+⌥(Option)+H로 확인할 수 있다.

해당 필드, 메서드를 어디에서 호출하고 있는지 계층으로 표시하여 알려준다.
접근 제어자가 적절하게 사용되었는지 다시 한번 확인해보자.
💭 분명 리펙토링을 하고 여러 번 검토를 했지만 뭔가 찝찝하다... 아무래도 if / else 조건문으로 일단 덕지덕지 붙여 만들어 그런가 싶기도 하다. 이번 과제는 해설과 코드 리뷰를 받고 나서 이 찝찝함을 해소해야 할 것 같다!