더북(TheBook)

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()을 활용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.