우테코 미션을 수행하던 중, 입력받은 String
이 정수 형태임을 검증해야할 일이 있었고, 이 과정에서 정규표현식
을 사용하게 되었다.
때문에 String
객체를 통해 바로 정규표현식 검증을 할 수 있는 String.matches()
에 대해 알아보는 과정에서,
String.matches()
사용을 지양하고Pattern
객체를 만들어서 검증해야 함을 배울 수 있었다.
// String.matches
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
// Pattern.matches
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
String.matches()
의 코드는 이렇게 작성되어 있는데, matches()
메서드를 실행할 때마다,
Pattern.matches(regex, this)
를 호출하여 새로운 Pattern
객체를 생성하고 검증 로직을 수행한다는 것을 알게 되었다.
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
반면 만들어둔 Pattern
객체에서matcher()
메서드를 실행하면
당연하게도 Pattern
객체 생성 과정을 생략하고, 입력받은 input 값과 매칭되는지 확인 후 Matcher
객체만 생성하여 return한다.
이 두 방식을 비교함으로써 검증에 사용할 정규표현식을
Pattern
객체로 미리 만들어놓고 사용하게 되면, 불필요한Pattern
객체 생성을 막고 메모리를 효율적으로 사용할 수 있음을 배울 수 있었다.
private boolean isNotNumberFormat(String text) {
return !text.matches("\\d+");
}
때문에 초반에 정규표현식을 검증하던 이 코드를
private final static String NUMBER_PATTERN = "\\d+";
private final static Pattern NUMBER_FORMAT = Pattern.compile(NUMBER_PATTERN);
private boolean isNumberFormat(String text) {
return NUMBER_FORMAT.matcher(text).matches();
}
위와 같이 변경하여 불필요한 객체 생성을 하지않도록 하여, 메모리 낭비를 막을 수 있었다.