Programming/Java \ Spring

[JAVA 예제연습] StringTokenizer 사칙연산 계산기 만들기

 

안녕하세요

 

오늘은 JAVA에서 기본적으로 많이사용하는

String클래스 및 문자열 관련 클래스를 배우면서

풀어본 StringTokenizer 클래스를 이용한

사칙연산 계산기 만들기 입니다.

 

 

 

 

[문제] StringTokenizer 클래스를 이용하여 사칙연산(+, -, *, /) 계산기 만들기

(연산자의 우선순위는 고려하지 않음, 좌측부터 순서대로 연산)

 

 

아래는 답&풀이입니다.

코드는 사람마다 다를수 있으며,

다른 값을 대입했을때도 원하는 결과가 나온다면

잘 작성한 코드입니다.

 

저와 다르게 코딩하신 분이 계시다면

댓글로 해당 코딩을 남겨주시면

공부하는데 많은 도움이 될 것 같습니다

 

 


 

 

 

 

1. 수식을 입력 받기 위한 구성 요소

 

Scanner sc = new Scanner(System.in);

String str2 = sc.next();

>> 스캐너 객체 생성하여 스캐너 타입의 변수에 대입

StringTokenizer의 파라미터값이 될

문자열 변수(str2)에 입력받은 문자열 대입

 

 

2. 문자열의 토큰(숫자, 연산자) 추출

 

StringTokenizer 클래스
"사과 배 복숭아" >> "사과", "배", "복숭아"

특별한 조건을 따로 주지 않으면 공백 기준으로 토큰(단어) 추출 

 

StringTokenizer str = new StringTokenizer(str2, "+,-,*,/", true)

>> 파라미터값으로

"문자열, 구분자(여러개 가능), 구분자를 토큰으로 인식하는지 여부"

를 확인합니다.

>> 입력받은 문자열 str2를 구분자(+-*/)로 토큰 구분을 하고

(각 숫자 토큰으로 추출)

구분자도 토큰으로 추출하여

StringTokenizer 타입의 변수 str 에 대입합니다

 

 

 

 

 

3. 추출된 토큰을 숫자로 인식(문자열>>숫자로 변환)하고

연산자에 맞는 연산하기

 

while(str.hasMoreTokens())

StringTokenizer 클래스의 메소드 hasMoreTokens()는

추출된 모든 토큰이 담겨 있습니다.

입력받은 수식(str2)에서 추출된 토큰의 갯수까지 true를 유지하고

반복횟수가 토큰의 갯수를넘기면 false가 되어 while문을 빠져나옵니다.

 

token = str.nextToken();

str.nextToken()을 보고 스캐너 클래스의 메소드라고 순간 착각했었습니다만,

StringTokenizer 클래스의 메소드입니다.

해당 메소드는 토큰값을 불러오는 역할을 합니다

반복 한턴이 지날 때 다음 토큰을 불러오기 때문에,

String token 변수에 미리 대입해줍니다.

(정상적인 수식이 입력될 경우 첫번째 토큰값은 숫자이기 때문에 바로 대입합니다)

 

if(token.equals("+")) {

token = str.nextToken();

amount += integer.parseInt(token) }

 

각 연산자는 숫자가 아니기에 연산하지 않고

다음 토큰을 불러와

integer.parseInt(token) 으로 토큰(문자열)을 숫자로 변환하여

기존 토큰(숫자)가 들어있는 amount에 + 연산합니다.

 

 -, *, / 연산도 같은 방법으로 진행합니다.

 

 

 

 

 

1번 빨간 박스 : try 구문이 정상적으로 실행되면

while 반복문을 빠져나가 계산기를 종료합니다

 

2번 분홍 박스 : try - catch 로 Integer.parseInt(token)시 변환되지 않는

데이터 타입(문자)가 수식 입력될 경우 

"수식 입력 오류!!!" 문구가 출력되면서

수식입력 부터(첫번째 while문) 다시 반복됩니다.

 

 


 

예제풀이 다른 버전의 코드

 

 

* 수정전 코드에서의 문제점

(위 사진은 수정후 코드입니다)


- 정상적으로 수식을 입력하면 반복입력이 되나,
오류수식(숫자가 아닌값이 연산값으로 주어졌을 경우)이

입력되면 1회 오휴확인문구 출력

다시 오류값 입력시 컴파일 오류 NumberformatException 발생


(catch문에 Exception 가 아닌

하위 예외구문 NumberformatException으로 기재하면,

숫자가 아닌 토큰을 예외처리합니다.)

 

- 즉, 오류수식 입력시 반복으로 프로그램이 돌아가지 않아

발생되는 오류로 전체 반복식으로 변경해주면 해결됨

빨간펜 : 강사님 추가 부분

이외 해결 방법으로 첫번째 while문에 label을 사용할 수도 있음

 

** 따로 메소드를 만들어 사용해도 구현 가능합니다.

 

 


 

 

프로그램이 실행된 화면