더북(TheBook)

정규식에 익숙해지려면 자바 API의 java.util.regex.Pattern을 살펴보세요.* 이 클래스는 자바의 정규식 표현이자 정규식을 만들고 실행하는 다양한 메서드를 제공합니다. 위 코드 조각처럼 정적 메서드인 matches()를 호출하면서 정규식인 String과 검색할 String을 제공하는 방식이 가장 쉬울 거예요. 이 방법은 유용하지만 성능을 저하시키는 요인입니다. 코드를 실행하면서 자바는 String 표현식인 regex를 가져와 regex로부터 특수한 목적의 오토마톤(automaton)을 만드는데요. 이 오토마톤은 패턴을 따르는 문자열만 허용하고 나머지는 모두 거절합니다.

Pattern.matches(regex,supply.toString())는 오토마톤을 컴파일해 supply.toString()과 부합시켜 봅니다. 정규식 오토마톤 컴파일은 클래스 컴파일처럼 시간과 처리 전력을 소모합니다. 보통 일회성 동작이지만 위 예제에서는 반복할 때마다 정규식을 컴파일하고 있습니다.

String.replaceAll()처럼 자바 API 내 매우 유명한 메서드도 똑같이 동작하는 여러 경우가 있습니다.

그렇다면 정규식을 반복해 컴파일하지 않으려면 어떡해야 할까요?

class Inventory {

    private List<Supply> supplies = new ArrayList<>();

    List<Supply> find(String regex) {
        List<Supply> result = new LinkedList<>();
        Pattern pattern = Pattern.compile(regex);
        for (Supply supply : supplies) {
            if (pattern.matcher(supply.toString()).matches()) { 
                result.add(supply);
            } 
        }
        return result;
    } 
}

 

 

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