Null Check Tip
August 04, 2004
Steve Maguire가 쓴 Writing Solid Code라는 책에서 보면 다음 코딩 관습의 차이를 이야기합니다.
1 if (ch = '\t') ExpandTab();
2
3 if ('\t' = ch) ExpandTab();
이 두 개의 문장은 잘못된 코딩 예입니다. 원한 것은 if (ch == '\t') ExpandTab(); 였으니까요.
하지만, Steve는 if ('\t' == ch) ExpandTab(); 와 같이 코딩을 하기를 요구합니다. 위의 잘못된 두 문장 중 아래 문장은 리터럴에 변수값을 대입하려고 시도하기 때문에 컴파일러 에러가 발생해서 에러를 검사할 수 있기 때문이지요.
물론 자바에서는 boolean이 int 와 같은 Cardinal들과는 구분되기 때문에 위와 같은 오류는 언어 차원에서 막아줍니다.
그 대신 객체의 null 값을 적절하게 검사하지 않아 RuntimeException인 NullPointerException이 발생하는 코드를 종종 보게 됩니다. 이것을 줄일 수 있는 코딩 관습이 있습니다. 아래 두 문장은 하는 일이 동일합니다.
1 if (a.equals("Hello")) doHello();
2 if ("Hello".equals(a)) doHello();
하지만 두번째 문장이 더 나은데 그 이유는 a에 대한 null 검사가 이루어진다는 점입니다. 자바는 equals() 메소드에 인자로 null이 들어오면 항상 false를 return하도록 요구하고 있습니다. 첫번째 문장의 경우 a가 null이면 NullPointerException이 발생하지만, 두번째 문장의 경우에는 정상적으로 처리가 됩니다.
이와 같이 null을 검사하여 NPE를 발생하지 않는 메소드나 연산자를 활용하면 좀더 깔끔한 코드를 작성할 수 있습니다. 예를 들어 instanceof 연산자의 경우
1 (null instanceof String)
과 같은 문장은 항상 false를 return합니다. 사실 이러한 결과는 null이 어떤 클래스로도 캐스팅이 가능하다는 점을 생각하면 약간 의아하게 느껴질지도 모르겠습니다.
instanceof 의 이 특성을 활용하면 equals() 메소드를 오버라이드하여 구현할 때 별도로 null 체크를 하지 않아도 됩니다.
1 public void equals(Object object) {
2 if (!(object instanceof MyClass)) { // null인지 검사하지 않아도 됨
3 return false;
4 }
5
6 // ....
7 }
여름이 한창입니다. 건강 관리 잘해서 멋진 소프트웨어를.... Happy Null Checking!!!
Posted by Yoon Kyung Koo at August 4, 2004 03:31 PM
Comments
저는 최근 Writing Solid Code 책 보고 있습니다. 하지만 그 코드를 자바쪽에 적용하는건 생각하지 못했던 발상이네요. 좋은 정보 얻어 갑니다. :-) Posted by: 어리숙 at September 1, 2004 11:26 AM