Today's Codekata
class Solution {
public int solution(String s) {
int answer = 0;
answer = Integer.valueOf(s);
return answer;
}
}
int.valueOf() 클래스가 아니라 사용 불가!
class Solution {
public long solution(long n) {
long x = (long) Math.sqrt(n);
if (x * x == n) {
return (x + 1) * (x + 1);
}
return -1;
}
}
Math.sqrt() 제곱근을 구할 때 사용한다. double 타입으로 반환되니 참고하자! Math.pow() ← 이건 제곱할 때!
처음에 머리를 굴려서 곱셈과 나눗셈만으로 구할 수 있을 것 같아 머리를 굴려봤으나 결국 구글의 도움을 받아 제곱근을 활용했다.
키오스크 프로젝트
if (pickMenu == 1) {
System.out.println("[ BURGERS MENU ]");
Menu burger = menu.get(pickMenu - 1);
List<MenuItem> menuItems = burger.menuItems;
for (int i = 0; i < menuItems.size(); i++) { // 반복문을 활용해 List 안에 있는 MenuItem을 하나씩 출력
System.out.println((i + 1) + ". " + menuItems.get(i).name + " | w " + menuItems.get(i).price + " | " + menuItems.get(i).info);
}
System.out.println("0. 뒤로가기");
int pickOrder = sc.nextInt();
switch (pickOrder) {
case 1: // 선택한 메뉴 : 이름, 가격, 설명
System.out.println("선택한 메뉴: 1. " + menuItems.get(0).name + " | w " + menuItems.get(0).price + " | " + menuItems.get(0).info);
continue;
case 2:
System.out.println("선택한 메뉴: 2. " + menuItems.get(1).name + " | w " + menuItems.get(1).price + " | " + menuItems.get(1).info);
continue;
case 3:
System.out.println("선택한 메뉴: 3. " + menuItems.get(2).name + " | w " + menuItems.get(2).price + " | " + menuItems.get(2).info);
continue;
case 4:
System.out.println("선택한 메뉴: 4. " + menuItems.get(3).name + " | w " + menuItems.get(3).price + " | " + menuItems.get(3).info);
continue;
case 0:
continue;
default:
throw new IllegalArgumentException("잘못된 번호를 입력하셨습니다."); // 유효하지 않은 입력에 대해 오류 메시지 출력
}
}
BURGERS, DRINKS, DESSERTS 세 메뉴 전부 이런식으로 만들어지다보니 중복되는 부분을 묶어서 메서드화 시켰다.
if (pickMenu == 1) {
System.out.println("[ BURGERS MENU ]");
subMenu(pickMenu);
continue;
}
그 결과! 이제야 왜 메서드를 활용하는지 알게 된 느낌이랄까? 길었던 코드들이 하나하나 정리가 되어가는게 너무 재밌다!
switch (pickOrder) {
case 1: // 선택한 메뉴 : 이름, 가격, 설명
System.out.println("선택한 메뉴: " + pickOrder + ". " + menuItems.get(0).getName() + " | w " + menuItems.get(0).getPrice() + " | " + menuItems.get(0).getInfo());
return;
case 2:
System.out.println("선택한 메뉴: " + pickOrder + ". " + menuItems.get(1).getName() + " | w " + menuItems.get(1).getPrice() + " | " + menuItems.get(1).getInfo());
return;
case 3:
System.out.println("선택한 메뉴: " + pickOrder + ". " + menuItems.get(2).getName() + " | w " + menuItems.get(2).getPrice() + " | " + menuItems.get(2).getInfo());
return;
case 4:
System.out.println("선택한 메뉴: " + pickOrder + ". " + menuItems.get(3).getName() + " | w " + menuItems.get(3).getPrice() + " | " + menuItems.get(3).getInfo());
return;
case 5:
System.out.println("선택한 메뉴: " + pickOrder + ". " + menuItems.get(4).getName() + " | w " + menuItems.get(4).getPrice() + " | " + menuItems.get(4).getInfo());
return;
다음은 이 부분인데 get()안에는 pickOrder - 1을 넣어주면 될 것 같고, 입력된 값에 따라 출력문이 나오도록 만들면 될 것 같은데...
그리고 지금은 일부러 각 메뉴들마다 메뉴아이템들이 3,4,5 각자 다르게 있도록 만들어놨는데, 그 List에 각 size()에 맞춰서 선택 범위가 정해지도록 만들어야 할 것 같다. 현재는 pickOrder에 5번을 입력하면 BURGERS MENU는 선택지가 4번까지 밖에 존재하지 않아서 해당 메뉴의 항목 수를 초과한 번호 입력 시 오류가 발생하므로, 이를 방지하는 로직이 필요하다.
public void pickedMenu(List<MenuItem> menuItems, int pickOrder) {
System.out.printf("%s: %d. %-13s | W%4.1f | %s\n",
"선택한 메뉴",
pickOrder,
menuItems.get(pickOrder - 1).getName(),
menuItems.get(pickOrder - 1).getPrice(),
menuItems.get(pickOrder - 1).getInfo());
}
콘솔에 깔끔하게 출력하기 위해 printf 활용법을 찾아봐서 적용해봤고, 중복 코드를 메서드로 분리하여 재사용성과 가독성을 높였다. 선택 범위를 벗어난 번호를 입력했을 때 발생하는 에러는 아직 해결하지 못 했다.
public void pickedMenu(List<MenuItem> menuItems, int pickOrder) {
String info = menuItems.get(pickOrder - 1).getInfo();
if (info != null && !info.equalsIgnoreCase("null")) { // drinks 메뉴의 설명을 일부러 비웠는데, 여전히 null로 표기된다.
System.out.printf("%s: %d. %-13s | W%4.1f | %s\n",
"선택한 메뉴",
pickOrder,
menuItems.get(pickOrder - 1).getName(),
menuItems.get(pickOrder - 1).getPrice(),
menuItems.get(pickOrder - 1).getInfo());
} else {
System.out.printf("%s: %d. %-13s | W%4.1f\n",
"선택한 메뉴",
pickOrder,
menuItems.get(pickOrder - 1).getName(),
menuItems.get(pickOrder - 1).getPrice());
}
}
또 DRINKS 메뉴는 null 일 땐 출력이 안 되게 하는 것도 시도해보고자 설명을 안 넣어봤는데, null 일 때와 "null" 문자열 일 때까지 그리고 혹시나 대소문자 문제일까하여 equalsIgnoreCase도 활용해봤으나 여전히 null이 출력된다. 어떤 방법으로 해야할지 아직 모르겠지만 포기하고 DRINKS 메뉴에 설명을 추가하는 것은 안 하고 싶어서 살짝 보류해둔 상태다.
마치며
오늘 코드를 메서드로 분리하는 작업을 여러 차례 진행해봤는데, 그 과정 가운데 재사용성에 대한 부분을 가장 크게 느낀 것 같다. 그저 가독성만을 위해서 중복되는 코드를 최대한 많이 메서드안에 집어넣어버렸더니 다음 단계를 진행할 때에 다시 꺼내서 정리하고 다시 메서드를 만드는 작업을 해야만 했다. 그냥 집어 넣는게 아니라 어떻게 다시 꺼내 쓸 수 있을지 즉 재사용성을 고려해야 한다는 걸 알았다. 이렇게 코드의 기능은 그대로 유지하면서 구조를 개선하는 과정이 리팩토링이라는 것을 배웠다. Java 문법에 대한 이해는 아직 부족하지만, 그 속에서 몰입하고 성취감을 느끼는 나를 발견한 하루였다. 이 경험들이 나를 성장시킬 거라 믿는다.