004 숫자만 포함하는 문자열인지 검사
이 해법에는 Character.isDigit()이나 String.matches() 메서드를 활용하면 된다.
Character.isDigit()을 활용하는 해법이 간단하고 빠르다. 문자열 내 문자를 순회하다가 이 메서드에서 false를 반환하면 루프를 종료한다.
public static boolean containsOnlyDigits(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
자바 8 함수형 스타일로 위 코드를 다시 작성하려면 anyMatch()를 이용한다.
public static boolean containsOnlyDigits(String str) {
return !str.chars()
.anyMatch(n -> !Character.isDigit(n));
}
이제 String.matches()를 활용하는 해법을 살펴보자. 이 메서드는 문자열이 주어진 정규식과 일치하는지 나타내는 boolean 값을 반환한다.
public static boolean containsOnlyDigits(String str) {
return str.matches("[0-9]+");
}
자바 8 함수형 스타일과 정규식 기반 해법은 대개 느리므로 속도가 중요하면 Character.isDigit()을 사용하는 첫 번째 해법을 쓰는 것이 좋다.
Info ≣ parseInt()나 parseLong()으로 위 문제를 해결하지 말자. 우선 NumberFormatException을 잡아 catch 블록에서 비즈니스 로직을 결정하는 것은 잘못된 관례다. 또한 두 메서드는 문자열이 유효한 수인지 확인할 뿐 숫자만 포함하는지는 확인하지 못한다(예를 들어 -4도 유효하다). 외부 라이브러리 지원을 받으려면 아파치 커먼즈 랭의 StringUtils.isNumeric()을 활용한다.