JAVA/Effective Java

규칙 57 예외는 예외적 상황에만 사용하라.

위들 wedul 2018. 5. 29. 23:51

예외는 잘 사용하면 프로그램의 가독성, 안전성, 유지보수성을 모두 향상시킬 수 있다. 그러나 제대로 사용하지 않으면 반대 효과를 낼 수있다.  

다음의 예를 보자.



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이 사용하는 최적화 기법 일부가 적용되지 않는다.

그렇기 때문에 예외는 예외적인 상황에만 사용해야 한다.