개발스토리지😃

[Java] 계산기 만들기 Level1 트러블 슈팅 본문

알고리즘/자바

[Java] 계산기 만들기 Level1 트러블 슈팅

believekim 2025. 2. 27. 16:17
스파르타내일배움캠프에서 계산기 만들기 도중
튜터님께 피드백을 받고 트러블슈팅을 해결한 과정을 담았다.



https://github.com/pleasebelieveme/sparta_nbcamp/blob/main/java-course/src/assignment/calculator/level1/Main.java

 

sparta_nbcamp/java-course/src/assignment/calculator/level1/Main.java at main · pleasebelieveme/sparta_nbcamp

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

github.com

 

 

 

1. 계산기 기능 소개

  • 파일 구조
calculator/
        ├── ui/
        │   └── Display.class
        └── level1/
            └── Main.class

- ui는 아래의 사이트를 참고하여 작성하였다.

https://wepplication.github.io/tools/asciiArtGen/

 

아스키아트 변환 사이트

텍스트 및 이미지(URL,파일첨부)를 아스키코드로 만드는 아스키아트 생성 사이트

wepplication.github.io

 

 

  • 기능소개
두 숫자의 값을 입력받아 사칙연산(+, -, *, /)을 해서 출력

 

 

2. 트러블 슈팅

  • while문 사용시 flag 활용
TO-BE: 아래와 같이 while은 항상 실행하도록 두었을 때 나중에 무한반복의 굴레에 갇힐 수 있다.
while (true) {
	if(종료를 원한다면) {
    	System.exit(0);
    }
}

 

AS-IS: flag변수를 boolean값으로 선언해주고 while의 탈출구를 만들어 준다.
// 변수 선언
boolean flag = true;

while (flag) {
	if(종료를 원한다면) {
    	// while문을 빠져 나온 뒤;
    	flag = false;
        continue;
    }
}
// 프로그램 종료
System.exit(0);

 

 

  • 입력값 검증
TO-BE: 스캐너로 정수를 입력받는데 다른 값을 넣었을때 에러가 터지로 프로그램이 종료된다.
Scanner sc = new Scanner(System.in);
// 숫자가 아닌 값이 들어왔을 때 검증이 필요
int firstNum = sc.nextInt();

 

AS-IS: while문과 if문과 hasNextInt()를 활용하여 검증한다.

 

while (flag) {
    if (sc.hasNextInt()) {
        firstNum = sc.nextInt();
        break;
    } else {
        System.out.println("숫자만 입력이 가능합니다.\n");
        // 잘못된 입력값 제거
        sc.next();
        // 다시 입력 받기
        continue;
    }
}

 

 

  • 결과값으로 오류를 검증하려고 했을 때 문제점
TO-BE: 사칙연산한 값을 result에 담아 출력하려는데 궁금한 점이 생겼다.
int result값을 0으로 초기화했을 때 1-1연산이 들어오면 연산을 한 것인지 오류가 난 것인지 확인하기 어렵지 않을까?

 

 

AS-IS: 0으로 초기화하고 연산과정에서 검증을 거치는게 효과적이다.
// 고민 내용 1
// int로 받을 수 있는 최소값을 받고 +1을 하면 이 결과값을 연산할 사용자가 확률적으로 지극히 낮다.
// 문제점: 확률은 낮으나 비효율적
int result = Integer.MIN.VALUE+1;

// 고민 내용 2
// null로 지정
// 문제점: null을 처리해주는 코드가 필요하기 떄문에 비효율적
Integer result = null;

 

 

  • 2초뒤 연산
Thread.sleep()을 써보고 싶어져서 이유없이 넣었다.
  • 문제점: 계산이 오래걸리는 것이 아닌데 불필요한 쓰레드를 점유
// 2초뒤에 응답
try {
	System.out.println("계산중...");
	Thread.sleep(2000);
} catch (InterruptedException e) {
 	System.out.println("시스템 오류발생!");
	throw new RuntimeException(e);
}