본문 바로가기
PROGRAM/effective JAVA

Generic - 컴파일 경고 메시지가 없게 하자.

by ojava 2011. 4. 21.
반응형

이 카테고리에는 'effective JAVA' 라는 책에 대해 공부한 내용을 포스팅하게 됩니다 ^.^




지난 번 포스팅에서 원천 타입이 아닌 Generic을 사용하자는 내용에 대해 다루었는데,

오늘은 Generic을 이용하면서 경고 메시지의 출력도 줄여보자는 내용입니다.

 

Generic을 사용하더라도 경고메시지가 출력되는 경우는 있습니다.

unchecked 류의 경고들이 출력될 수 있는데, 이는 Generic을 많이 사용해 볼수록 나타나는 빈도는 줄어들겠지만
일단 나타난 경고 메시지들은 가능하다면 최대한 제거하는 것이 좋겠지요!

 

여기서 말하는 unchecked 경고메시지에는 캐스트 경고, 메소드 호출 경고, 제네릭 배열 생성 경고, 변환 경고 등이 포함됩니다.
이러한 모든 unchecked 경고 메시지는 런타임시에 ClassCastException가 발생할 수 있다는 것을 의미합니다. _

 

위와 같은 경고메시지들이 뜨지 않는 코드를 만드는 것은, 코드의 타입 안정성이 보장된다는 것을 말하는 것과 같은 의미가 됩니다.
또한 런타임시에 ClassCastException 예외가 발생하지 않는다는 의미가 되기도 하므로
애초에 프로그래머가 코드를 작성했던 의도대로 작동할 가능성이 높아집니다.

 


 

잘못된 형식을 사용해서 발생한 경고 메시지들, 예를 들어 원천 타입을 사용한 경우라면 < > 안에 실 매개변수 타입을 지정해주어
Generic으로 변환해 간단하게 없앨 수 있는 경고가 존재하는 반면,  어떻게 없애야 할 지 머리를 싸매고 고민해야 하는 경고들도 존재합니다.



이러한 경고 메시지를 없애는 방법으로는 먼저 @SuppressWarnings(“unchecked”) 주석을 사용하는 방법이 있습니다.
 
 

1. 이 방법은 경고가 발생된 부분의 코드가 타입 안전을 보장할 경우에 사용해야 합니다.

그렇지 않은 상태에서 Suppress 주석을 통해서 강제로 경고 발생을 억제할 경우에는,
코드의 컴파일은 되겠지만 런타임시에 ClassCastException가 발생하므로
애써서 Generic 타입을 사용한 것의 의미가 없게됩니다. ㅠ_ㅠ

그렇다고 해서 타입이 안전한 코드의 경우에도 Suppress 주석을 통해 경고를 억제하지 않고 방치한다면
실제 문제가 될 수 있는 내용에 대해서 경고를 띄웠을 때, 잘 알아보기 힘들게 됩니다.

 
 

2. SuppressWarnings 주석은 지역 변수부터 클래스까지 다양한 범위에 사용이 가능하지만,
     가급적이면 가장 작은 범위로 사용해야 합니다.

그 이유는 작은 내용에 대해서 경고를 억제하기 위해 더 큰 범위에 대해 나타날 수 있는 경고를 억제할 경우,
실제 오류를 발생시키는 내용에 대해서도 알아보기 힘들게 되는 문제가 발생하기 때문입니다!

그러나 SuppressWarnings 주석은 return 문에 사용할 수는 없습니다.

이는 선언문이 아니기 때문이죠. 따라서 return문에서 반환하는 값이 경고메시지를 출력할 가능성이 있다면,
반환값을 따로 저장해둔 지역변수에 SuppressWarning을 사용하면 해결됩니다.




3. 만약 타입 안전이 보장되는 코드에 SuppressWarnings을 사용하여 경고메시지를 억제하게 될 경우가 발생한다면,
     이 주석을 통해서 경고 메시지를 억제하는 이유를 써두는 것이 좋겠지용?
 

그 이유로는 그 코드를 공유하는 다른 사람들과 이 주석을 통해 소통이 가능하며,
더 나아가 SuppressWarnings을 사용한 이 코드의 타입 안전성을
다른 사람들이 불안전하도록 변화시키는 것을 막을 수 있기 때문입니다.





세모모양의 노란색 상자가 나타나는 것을 방지해야 더 좋은 코드가 된다는 것을 알았으니
앞으로는 좀 더 세심하게 코딩하는 습관이 들겠군요!
되도록이면 코드 자체의 잘못된 점을 바로잡아 오류를 해결하는 것이 가장 좋은 방법이겠지만
코드가 안전함에도 불구하고 오류가 발생한다면 @SupressWarnings 을 통해 억제할 수 있다는 내용이었습니다.

다음 effective JAVA 주제는 배열보다는 List를 사용하자입니다.
이제 정말 봄이 왔나보네요. 따뜻한 날씨가 기분좋은 하루네요. 좋은 하루 보내세요^.^ 




 2011.04 벚꽃이 예쁘게 핀 날 오혜영 작성

반응형