[Java] 자바 정규표현식 활용 시, Pattern 객체를 만들어 사용하자 (feat. 우테코)

pgmjun·2023년 10월 30일
2

java

목록 보기
2/3
post-thumbnail

🔥 개발 중 발견한 String.matches()의 문제

우테코 미션을 수행하던 중, 입력받은 String이 정수 형태임을 검증해야할 일이 있었고, 이 과정에서 정규표현식을 사용하게 되었다.

때문에 String 객체를 통해 바로 정규표현식 검증을 할 수 있는 String.matches()에 대해 알아보는 과정에서,

String.matches() 사용을 지양하고 Pattern 객체를 만들어서 검증해야 함을 배울 수 있었다.



⚙️ String.matches()의 내부

String.matches()

// 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 객체를 생성하고 검증 로직을 수행한다는 것을 알게 되었다.

Pattern.matches()

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();
}

위와 같이 변경하여 불필요한 객체 생성을 하지않도록 하여, 메모리 낭비를 막을 수 있었다.

profile
하나씩 천천히 깊이있게 쌓아가는 백엔드 개발자 최승준입니다.

0개의 댓글