TIL11. 키오스크 Lv2,3 진행
Lv2. 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리
어려웠던 점 - 배열 출력
실수한 코드 & 오류
menuItems= new ArrayList<>();
menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
for(int i = 0; i < menuItems.size(); i++) {
System.out.println((i+1)+". "+menuItems.get(i));
}
문제 원인 : `menu.get(i)` 는 MenuItem의 객체를 출력하고 있는데, MenuItem 클래스에서 toString() 메서드를 오버라이딩 하지 않아서 객체의 메모리 주소가 출력 되는 것임.
🔹 toString()이란?
- 모든 Java 객체가 기본적으로 가지고 있는 메서드
- 객체를 문자열로 변환할 때 호출되는 메서드
- 모든 클래스는 Object 클래스를 자동으로 상속받는데, Object 클래스에 기본적으로 toString()이 정의됨
- 하지만 기본 toString()은 객체의 메모리 주소를 반환함
- 그래서 우리가 원하는 정보(예: 메뉴 이름, 가격, 설명)가 아니라 "example.kiosk.MenuItem@70177ecd" 같은 값이 나오는 것.
🔹 toString()을 오버라이딩하는 이유
- 원하는 형식으로 객체 정보를 출력하려면 toString()을 오버라이딩(재정의) 해야함
- toString() 메서드를 우리가 직접 작성해서 원하는 문자열을 반환하도록 수정하는 것
- MenuItem.java에 다음 코드 추가
@Override
public String toString() {
return String.format("%-15s | W %.1f | %s", name, price, description);
}
이러면 Lv2 요구사항에서
MenuItem 클래스를 생성해서 햄버거의 이름, 가격, 설명 세팅하기 - ✅ 완료
main 에서 List를 선언하여 MenuItem 추가 후 반복문으로 menuItem 접근하기 - ✅ 완료
Lv3. 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기
✅ Kiosk 클래스 생성
✅ menuItems 리스트를 Kiosk 클래스에서 관리
✅ start() 메서드에서 메뉴 출력 및 사용자 입력 처리
✅ main() 함수에서는 Kiosk 객체를 생성하고 start()를 호출
✅ 0 입력 시 종료 / 잘못된 입력 처리 추가
어려웠던 점 - 잘못된 입력 시에 예외 추가 하기
이전까지는 잘못된 숫자 입력에 대한 예외 처리가 없었다. 0이외에 숫자 or 문자열이 들어가는 것을 방지해야 한다.
🔹 이 과정을 정리하면?
- `scanner.nextLine()` → 입력값을 문자열로 받음
- `Integer.parseInt(입력값)` → 문자열을 숫자로 변환(사용자의 입력값을 숫자로 변환해 choice 변수에 저장하기 위함)
- 숫자로 변환할 수 없는 값(예: "abc", "3.14")이 입력되면 NumberFormatException 발생
- `try-catch`로 예외를 처리해서 프로그램이 멈추지 않게 함
try{
choice = Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("올바른 숫자를 입력하세요");
continue;
}
오늘 하루 회고
저번 계산기 과제 때 신경쓰지 못한 ` 컨벤션을 지킨 커밋 횟수가 10회 이상이다.` 를 지켜보기 위해서 어떤 방식으로 커밋을 하면 되는지 찾아봤다. 뭔가~ 여러 블로그를 통해서 이런 느낌이구나!를 느껴봤지만 실제로 제대로 적용하진 못했다.
또 계산기 과제를 하면서 요구사항에 필요 없는 것(ex:GUI)들을 해버렸는데 이번엔 발제를 꼼꼼하게 보고 천천히 그 레벨에서 요구하는 것들을 하나씩 추가해가면서 만들어봤다.
2번 이상 커밋을 눌러버린다던지 뭐 쓸데없는 것들도 들어가고 그랬다.. 이래도되는것일까