[Java] String 의 matches 대신 Pattern

String 의 matches

자바에서 특정 기준에 맞는 문자열인지 확인하기 위해 정규식을 사용한다. 아래는 숫자인지 판단하는 정규식의 예시이다.

private void validateNumber(final String string) {
        if (!string.matches("-?[0-9]+")) {
            // 예외처리
        }
    }

정규식에 대한 정보는 여기에서 확인할 수 있다. 위의 코드는 음수양수 모두 가능하며 0에서 9사이의 값이 한개 또는 그 이상 있을 수 있는지를 판단한다. 즉, 숫자인지 판단하는 메서드이다.

하지만 String 에서 제공하는 matches 는 내부적으로 Pattern 객체를 생성한다.

public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}

String.matches 를 이용하여 검증을 한다면 매번 Pattern 객체를 생성해야 한다. 매번 동일한 메서드를 호출하더라도 매번 새로운 객체를 생성하여 결국은 불필요한 객체가 여러번 생성 되는 결과를 낳는다. 생성 횟수가 늘어날 수록 성능에 영향을 끼친다. 생성 후 재사용되지 않는 Pattern 객체들은 가비지 컬렉션의 대상이 된다.

Pattern

Pattern 으로 검증하는 방법은 두 가지이다.

1. 정규식 및 검증값을 입력하여 바로 검증

Pattern.matches(regex, input);

Pattern 의 matches 의 내부 코드는 다음과 같다. Pattern 객체를 입력한 정규식으로 컴파일Matcher 객체 생성 및 일치하는지 확인한다.

public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

2. 컴파일 후 검증

직접 컴파일 후 검증하도록 짤 수도 있다.

Pattern.compile(regex).matcher(input).matches();
public static Pattern compile(String regex) {
    return new Pattern(regex, 0);
}

컴파일 시 새로운 Pattern 객체가 생성됨을 알 수 있다. 동일한 정규식을 여러번 사용해야 한다면 컴파일한 Pattern 객체를 미리 생성해둔 후 검증하는 과정만 호출 하는 것이 성능을 개선하기에 좋다. 자바 공식문서에서도 권장하는 방법이다.

If a pattern is to be used multiple times, compiling it once and reusing it will be more efficient than invoking this method each time.

숫자인지 확인하는 코드를 Pattern 을 이용하여 구현한 예시이다. static 으로 선언하여 불필요하게 매번 객체가 생성되는 것을 방지하였다.

public class Regex {

    public static final Pattern NUMBER = Pattern.compile("-?[0-9]+");
}

참고 사이트

좋은 웹페이지 즐겨찾기