어제에 이어서 진행한다.
먼저 오늘 진행하기에 앞서, 정규식과 Pattern, matches를 선행 학습해봤다.
참고한 url: https://coding-factory.tistory.com/529
class Inventory {
private List<Supply> supplies = new ArrayList<>();
List<Supply> find(String regex) {
List<Supply> result = new LinkedList<>();
for (Supply supply : supplies) {
if (Pattern.matches(regex, supply.toString())) {
result.add(supply)
}
}
return result;
}
자, 이 코드를 실행하면서 자바는 String 표현식인 regex를 가져와 regex로부터 특수한 목적의
오토마톤(automaton)을 만드는데,
이 오토마톤은 패턴을 따르는 문자열만 허용하고 나머지는 모두 거절한다.
정규식 오토마톤 컴파일은 클래스 컴파일처럼 시간과 처리 전력을 소모하는데,
위 코드에서는 for문 안에 들어가서 반복할 때마다 정규식을 컴파일 하고 있는 중이다.
=>(와.. 시간은 그렇다쳐도 처리 전력..?)
그렇다면 정규식을 반복해 컴파일하지 않으려면 어떡해야 할까?
어떻게 잠재적 성능 저하를 막아야 할까?
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.matches(supply.toSting(),matches()) {
result.add(supply);
}
}
return result;
}
해법은 계산이 많이 필요한 연산은 가급적 적게하는 것이다.
이렇게 반복문을 실행할 때 미리 컴파일해 놓은 정규식을 쓰면 된다.
다행히 Pattern API로 한 번에 쉽게 컴파일할 수 있었다.
Pattern.compile() 이 계산이 많이 필요한 단계이므로 지역변수에 저장하고,
if문에서 활용한다.
오늘의 코멘트: 새로운 개념들을 알게되서 좋다. 나중에 써먹을 수 있겠지?