1단계 계산기 기능 정리
while (true) {
boolean possible = true; // boolean은 연산 처리와 오류 방지 로직을 깔끔하게 제어하기 위한 장치로써 사용했다.
// 다음 계산시에 true로 다시 바꿔주기 위해 반복문 맨 윗줄에 적어주었다.
System.out.print("사칙연산 기호를 입력하세요 : ");
char operator = sc.next().charAt(0);
double result = 0; // 나눗셈에서 소숫점까지 표현해주기 위해 double로 표현
switch (operator) {
case '/':
if (positiveInteger2 == 0) {
System.out.println("0으로 나눌 수 없습니다.");
System.out.println(); // 줄을 한 칸 띄어주기 위해
continue; // 두 번째 양의 정수가 0이더라도 계산결과를 나타내주는 것을 방지하기 위해 현재 반복을 건너뛰게 해주었다.
} else {
result = (double) positiveInteger1 / positiveInteger2;
}
break;
default:
System.out.println("올바른 사칙연산 기호를 입력해주세요.");
possible = false;
}
boolean은 연산 처리와 오류 방지 로직을 깔끔하게 제어하기 위한 장치로써 사용했다.
왜냐하면, 특정한 조건에서 에러가 발생하기 때문이다.
예를 들자면, 사용자가 사칙연산 기호를 제대로 입력하지 않았을 때 false로 바꾸어줌으로써
결과값을 내보내지 않는 일종의 차단막으로써 사용했다.
사실, 굳이 사용하지 않아도 continue를 사용해주면서 더 간결하게 표현을 할 수는 있다.
하지만, 사용해주는 이유는 위의 이유뿐만 아니라 흐름을 좀 더 읽기 쉽도록 설계하고 싶었기 때문이다.
조건문 안에 조건이 4개나 들어가있고 조건문이 완료되고 break로 조건문을 나오게되었을 때,
갑자기 println으로 결과값을 출력하는 명령어가 나온다면 처음 보는 사람은 흐름을 읽기 어려울것이다.
그래서 다른 사람들이 보기에 흐름을 읽기 편하도록 사용해주었다.
또 살펴볼 점은, 결과값을 double로 정의해주었는데, 이는 나눗셈 연산 후에 int형이라면 제대로 연산이 되지 않기 때문이었다.
그리고 나눗셈 케이스에서 두 번째 양의 정수가 0이더라도 계산결과가 출력되는 에러가 발생했다.
이걸 해결하기 위해서 continue를 사용하여 반복문의 처음 부분으로 돌아가도록 설계해주었다.
그리고 else 부분에도 (double)로 강제 형변환을 해주었는데, 이는 양의정수를 int형으로 받아왔기 때문에,
실수형으로 바꿔주기 위하여 강제 형변환을 시켜준 것이다.
그리고 위에서 말한 오류 방지 로직을 위한 부분인데,
default를 해줌으로써 예외상황(올바른 사칙연산 기호를 입력하지 않았을 때)을 방지하였다.
if (possible){
System.out.println("결과: " + result);
}
이는 possible이 true일 때 결과값을 출력해주는 코드이다.
System.out.print("엔터키를 누르면 다음 계산으로 넘어갑니다. (exit 입력 시 종료)");
sc.nextLine(); // 엔터키를 통해 다음 계산으로 부드럽게 넘어갈 수 있다.
String exit = sc.nextLine(); // 단어를 입력받을 준비
if (exit.equals("exit")){
System.out.println("계산기를 종료합니다.");
break;
}
이 부분에서 sc.nextLine(); 를 보면,
저 부분이 없었을 때는 계산을 완료한 뒤에 다음 계산으로 넘어가고싶은데,문자든 숫자든 뭐든 입력을 해야 넘어가졌다.
이게 좀 불편해서 간단하게 엔터키를 누르면 다음 계산으로 넘어가기 위해 공백도 입력을 받아서 처리해주는 코드를 작성해주었다.
nextLine()은 줄 바꿈까지 포함한 전체 문자열을 받아오는 메서드다.
처음으로 사용해보는 부분
char operator = sc.next().charAt(0);
1. next()
- 공백(스페이스, 탭, 엔터) 전까지의 단어 하나만 읽어옴
- 줄 전체가 아니라 단어 단위 입력
2. nextLine()
- 한 줄 전체를 읽어옴 (엔터를 기준으로)
- 문자열 사이에 공백이 있어도 그대로 포함됨
3. charAt(0)
- **문자열(String)**의 첫 번째 글자를 char 타입으로 추출
- sc.next()는 → "+" (문자열)
- .charAt(0)는 → '+' (문자)
그래서 순서를 생각해보자면, 내가 입력된 문자열을 공백 전까지의 단어 하나로 읽어와준다. (next())
그리고 읽어온 문자열의 첫번째 문자를 가져와주고 (.charAt(0)) 이를 operator라는 변수에 char 형으로 저장해준다.
그리고 .charAt(0)에서 0은 문자열에서 0번째에 있는 문자를 출력하는 뜻이다. 만약 1이라면 문자열의 두번째에 있는 문자가
출력될 것이다.