String str = "1234";
String str1 = "1234o";
1234와 1234o을 charAt() 메소드로 한자리 씩 끊어서 숫자인지 검사하고,
모두 숫자로 이루어진 문자열만 "숫자입니다." 를 출력하고, 모두 숫자로 이루어져 있지
않으면 "숫자가 아닙니다."를 출력하라는 문제였다.
여기서 문제를 풀때는 이렇게 풀었다.
Chacter클래스의 isDigit() 메소드를 사용하면,
한자리 한자리씩 for문을 통해 돌면서 숫자인지 아닌지 판단해준다.
public class NumericExample { public static void main(String[] args) { String str1 = "1234"; String str2 = "1234o"; isNumber(str1); isNumber(str2); } public static void isNumber(String str) { boolean isNumeric = false; for(int i=0; i<str.length(); i++) { if(Character.isDigit(str.charAt(i))) { isNumeric = true; }else { isNumeric = false; } } if(isNumeric) { System.out.println("모두 숫자입니다."); }else { System.out.println("모두 숫자가 아닙니다."); } } }
이렇게 코드를 작성하였다.
boolean 타입의 isNumeric은 숫자일경우 true값을 갖고,
숫자가 아닐경우 false값을 갖는데, str2는 끝의 "o" 이 숫자가 아니므로 숫자가 아니라고 출력이 될것이다.
중간에 문자가 있거나 공백이 껴있으면, isNumeric이 false가 되었다가 true값으로 바뀌면서 잘못된 결과가 출력되기 때문이다.
public class NumericExample { public static void main(String[] args) { String str1 = "1234"; String str2 = "123 4 5"; String str3 = "12a45"; String str4 = " 1"; isNumber(str1); isNumber(str2); isNumber(str3); isNumber(str4); } public static void isNumber(String str) { boolean isNumeric = false; for(int i=0; i<str.length(); i++) { if(Character.isDigit(str.charAt(i))) { isNumeric = true; }else { isNumeric = false; } } if(isNumeric) { System.out.println("모두 숫자입니다."); }else { System.out.println("모두 숫자가 아닙니다."); } } }
str2~str4는 중간에 공백이 있거나 처음에 공백이 있고 마지막이 숫자거나, 중간에 문자가 있다.
이럴경우에 똑같은 코드로 결과를 실행하면,
아래와 같이 전부 숫자라고 나온다.
왜냐하면 for문은 str의 길이만큼 계속 반복하여 실행되기 때문에, 마지막 자리가 숫자가 맞으면 마지막 isNumeric의 값이 true가 되기 때문에 그렇다.
숫자가 아닌 값을 만났을때 for문을 break해줘서 isNumeric이 false인 상태로 출력을 해야, 제대로 된 값이 나온다.
아래가 수정한 코드다. else 블럭에서 break문을 추가하였다.
public static void main(String[] args) {
String str1 = "1234";
String str2 = "123 4 5";
String str3 = "12a45";
String str4 = " 1";
isNumber(str1);
isNumber(str2);
isNumber(str3);
isNumber(str4);
}
public static void isNumber(String str) {
boolean isNumeric = false;
for(int i=0; i<str.length(); i++) {
if(Character.isDigit(str.charAt(i))) {
isNumeric = true;
}else {
isNumeric = false;
break;
}
}
if(isNumeric) {
System.out.println("모두 숫자입니다.");
}else {
System.out.println("모두 숫자가 아닙니다.");
}
}
}
출력도 제대로 나온다.
문제를 해결하는 것에서 끝내도 좋지만, 갑자기
그러면 중간에 공백이 껴있거나 끝이 숫자로 끝나면 제대로 된 값이 안나오지 않을까 하는 생각에 실험해보니 또 다른 답을 찾을 수 있었다.