개발스토리지😃

[Java] 키오스크 만들기 Level1 트러블 슈팅 본문

언어/자바

[Java] 키오스크 만들기 Level1 트러블 슈팅

believekim 2025. 3. 7. 16:41

 

스파르타내일배움캠프에서 키오스크 만들기 Level1의 개발 과정을 담았다.
이전 계산기를 만들때 요구사항을 주의깊게 듣지 않아 완성도를 떠나 동떨어진 결과가 나왔다.
그래서 이번 과정에서는 요구사항에 시간을 더 투자할 것이다.

 

 

 

시스템 환경
IDE : Intelli J
language : Java 17

 

 

https://github.com/pleasebelieveme/sparta_nbcamp/tree/main/java-course/src/assignment/kiosk/level1

 

sparta_nbcamp/java-course/src/assignment/kiosk/level1 at main · pleasebelieveme/sparta_nbcamp

Contribute to pleasebelieveme/sparta_nbcamp development by creating an account on GitHub.

github.com

 

 

1. 요구사항

1. 실행시 햄버거 메뉴 출력 및 선택하기
2. Main클래스 하나에 모두 실행하기

 


2. Main

  • 길지 않기에 코드를 모두 담았다.
package assignment.kiosk.level1;

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	boolean flag = true;

	while (flag) {
	  System.out.println("\uD83E\uDD17 키오스크를 시작합니다. \uD83E\uDD17");
	  System.out.println("1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거\n"
	  + "2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거\n"
	  + "3. Cheeseburger  | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거\n"
	  + "4. Hamburger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거\n"
	  + "0. 종료");

	  if (!sc.hasNextInt()) {
	    System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.\n");
		sc.next();
		continue;
	  }

	  // 사용자 입력
	  int choice = sc.nextInt();

	  // 메뉴 번호 범위 체크
	  if (choice < 0 || choice > 4) {
		System.out.println("메뉴에 나와있는 번호를 입력해주세요.\n");
		continue;
	  }

	  // 메뉴 선택 처리
	  switch (choice) {
		case 1:
		  System.out.println("ShackBurger를 선택하셨습니다.\n");
		  break;
		case 2:
		  System.out.println("SmokeShack를 선택하셨습니다.\n");
		  break;
		case 3:
		  System.out.println("Cheeseburger를 선택하셨습니다.\n");
		  break;
		case 4:
		  System.out.println("Hamburger를 선택하셨습니다.\n");
		  break;
		case 0: 
		  flag = false;
		  System.out.println("프로그램을 종료합니다.");
		  break;
		} // switch
	  } // while
	sc.close();
	}
}

 


 

3. 트러블 슈팅

  • scanner.hasNextInt()
hasNestInt()함수를 사용할 때 항상 개행문자가 남아있었다.

아래 처럼 먼저 숫자를 입력 받고 hasNestInt()로 검증을 하였기 때문에 발생하는 문제였다.
int choice = sc.nextInt();

if (!sc.hasNextInt()) {
  System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.\n");
  sc.next();
  continue;
}


만약에
  1. 사용자가 3을 입력하면, sc.hasNextInt()는 true를 반환하고
  2. if (!sc.hasNextInt()) 조건을 통과한 후
  3. int choice = sc.nextInt();가 실행되어 choice에 3이 저장된다.


그래서 아래와 같이 수정되었다.

if (!sc.hasNextInt()) {
  System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.\n");
  sc.next();
  continue;
}

int choice = sc.nextInt();

 

 

  • System.exit(0)
즉시 종료를 나타내는 System.exit(0)를 항상 사용하였는데 챗 GPT에게 물어볼때마다 빠져있어서 찾아보았다.

아래 코드는 내가 자주 사용하던 예시이다.
// 사용자가 0을 입력하면 종료
switch (choice) { ...
  case 0:
 	System.out.println("프로그램을 종료합니다.");
    System.exit(0);
}


문제점
1. 자원 해제
  프로그램 종료 시에 자원을 적절히 해제하지 않고 종료될 수 있다. 이번에 사용한 것은 Scanner인데 메모리 누수 등의 문제가 발생할 수 있다.


2. 후속 작업 실행없이 즉시 종료
  System.exit(0)을 호출하면, 그 이후에 작성된 코드들이 실행되지 않는다. 메시지를 출력하는 코드가 뒤에 있다면 출력되지 않으  며 finally 블록 또한 실행되지 않는다.

그래서 System.exit(0)는 사용하지 않고 정상 종료할 수 있도록 코드를 수정하였다.
꼭 필요한 경우는 이번 과정에서 발생하지 않을 듯 싶다.