반응형
예외는 잘 사용하면 프로그램의 가독성, 안전성, 유지보수성을 모두 향상시킬 수 있다. 그러나 제대로 사용하지 않으면 반대 효과를 낼 수있다.
다음의 예를 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Main { public static void main(String args[]) { int i = 0; Test[] data = new Test[] {new Test("t1"), new Test("t2")}; try { while(true) { System.out.println(data[i++].getData()); } } catch (ArrayIndexOutOfBoundsException ex) { } } static class Test { Test(String a) { this.a = a; } private String a; public String getData() { return a; } } } | cs |
위의 코드는 Test 객체 배열 data를 순회하면서 각 element의 getData() 메소드를 실행시킨다. 그러면서 index의 범위를 넘어설 것을 대비하여 try-catch문장을 사용하였다.
하지만 다음과 같이 변경하면 위와같은 try-catch를 사용할 필요가 없다. 왜냐하면 JVM이 알아서 경계너머를 참조하지 않도록 검사해주기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Main { public static void main(String args[]) { Test[] data = new Test[] {new Test("t1"), new Test("t2")}; for (Test dd : data) System.out.println(dd.getData()); } static class Test { Test(String a) { this.a = a; } private String a; public String getData() { return a; } } } | cs |
위에 예와 같이 예외를 통해 구현한 순환문은 표준적인 순환문 보다 훨 씬 느리다. (100개의 원소를 갖는 배열일 경우일 때 두 배이상의 속도의 차이가 발생한다.)
그 이유는 다음과 같다.
- 예외는 예외적 상황을 고안된 것이기 때문에, JVM은 빠르게 만들필요가 없다고 판단한다.
- try-catch 블록 안에 넣어둔 코드에는 최신 JVM이 사용하는 최적화 기법 일부가 적용되지 않는다.
그렇기 때문에 예외는 예외적인 상황에만 사용해야 한다.
반응형
'JAVA > Effective Java' 카테고리의 다른 글
규칙 59 불필요한 점검지정 예외 사항은 피하라. (0) | 2018.05.29 |
---|---|
규칙 58 복구가능 상태에는 점검지정 예외를 사용하고, 프로그래밍 오류에는 실행시점 예외를 이용하라. (0) | 2018.05.29 |
규칙 56 - 일반적으로 통용되는 작명 관습을 따르라 (0) | 2018.05.29 |
규칙 55 - 신중하게 최적화하라 (0) | 2018.05.29 |
규칙 54 - 네이티브 메서드는 신중하게 사용하라. (0) | 2018.05.29 |