사실 이 이야기는 Effective Java 6장 - 불필요한 객체 생성을 피하라 에 나오는 아주 기초적인 이야기 이다. 그러나 습관이 되지 않아 생각없이 개발하다보면 어느새 이 규칙을 어겨서 어김없이 리팩토링 대상이 되곤 하는데다가, 막상 개발하면서 쓰려다 보면 사용 방법이 잘 생각나지 않아 메모할 겸 짧은 글을 작성 해본다. (요즘 좀 정신이 나가 있어서 공부는 꾸준히 하기는 한다만, 공부하는 양은 좀 줄었고, 진도는 좀처럼 나가지가 않는다. 에라이)
@DisplayName("Utils 테스트") classUtilsTest{ @Test @DisplayName("숫자 외의 문자가 있을 경우 false를 return 해야 한다") voidshould_return_false_when_has_other_characters(){ String numbersWithCharacter = "1a2s3d4f5g6"; boolean expected = false;
boolean result = Utils.hasOnlyNumbers(numbersWithCharacter);
assertEquals(expected, result); } @Test @DisplayName("숫자외의 문자가 없을 경우 true를 return 해야 한다") voidshould_return_true_when_has_only_numbers(){ String numbersWithCharacter = "123456789"; boolean expected = true;
boolean result = Utils.hasOnlyNumbers(numbersWithCharacter);
assertEquals(expected, result); } }
오케이, 원하는 바를 손쉽게 얻었다. 그러나 지금 얻은 결과는 성능상 좋지 못하다. 사실 일반적인 상황에서 String의 matches 메소드를 사용하는게 엄청나게 성능에 문제를 주는 경우는 별로 없으나, 습관이 중요한데다가, 실제로 이런 코드들이 쌓여 문제를 발생하는 경우도 있으니 좋은 습관을 들이는 게 좋다. 이펙티브 자바는 String.matches를 사용하는 것보다 더 고급지고어렵고 성능이 좋은 방법을 알고 있다.
Pattern 클래스를 사용해 보자
바로 Pattern클래스를 사용해 같은 일을 더 성능 좋게 사용할 수 있다. 사실 위 예제의 코드는 메소드가 실행 될때마다 내부적으로 Pattern 인스턴스를 만들고 사용 후 버리는 작업을 수행하게 되는데, 이 Pattern을 final static 객체로 미리 선언해두고 사용하게 되면 메소드가 호출될 때마다 새로 생성하고 버리는 작업이 없어지게 된다. 아래 코드를 보자