안녕하세요
오늘은 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을 사용할 수도 있음
** 따로 메소드를 만들어 사용해도 구현 가능합니다.
'Programming > Java \ Spring' 카테고리의 다른 글
[인프런] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (0) | 2021.03.24 |
---|---|
for문을 중첩하지 않고 구구단 출력하기 (0) | 2021.03.09 |
윈도우 자바 버전 확인하기, JDK 버전 확인하기 (0) | 2021.03.03 |
Java Path 환경변수 설정 방법 & 환경변수 path 복원 방법 (0) | 2021.01.01 |
[자바 예제연습] while문 사용해서 구구단 출력하기 (0) | 2020.09.03 |