안녕하세요.
전 원래 C/C++ 로 주 언어 였고,
이전에도 Java 언어는 알기는 했지만, 안드로이드 때문에 Java를 많이 사용하게 되었답니다.
Java 코드를 보면서
참 희한하게 코딩을 한다고 느낀 것중에 하나가,
if ("".equals(문자열변수))
이런식의 코딩이었답니다.
C/C++ 언어라면 상상도 할 수 없는 코딩이죠.
아무튼 이런식으로도 코딩을 하는구나 하고는 알게 되었지만.
태생이 C/C++ 보다 보니까, 아무래도 어색한 표기인것은 어쩔 수가 없더군요.
그래서, 주로
if ( 문자열변수.equals(상수))
이런식을 표기를 주로 사용했답니다.
두 조건절의 의미는 똑같지만, 두번째 비교가 저한테는 더 익숙했으니까요.
그런데, 지난주에 첫번째 비교의 힘을 깨닫는 경우를 발견하였답니다.
평소와 같이
String final static DEFAULT = "default";
void func(String str) {
if ( str.equals(DEFAULT)) {
.....
}
}
이런식으로 코딩을 했었는데요.
그런데, 파라미터로 null 이 넘어오는 경우가 생겼고,
프로그램이 null exception 나오면서 죽어 버리더군요.
null 체크를 안한 제 불찰이기는 하지만,
만약 위 상황을 앞에서 이야기한 상수가 앞에오는 비교였다면 아무 문제가 없을 코드 였답니다.
String final static DEFAULT = "default";
void func(String str) {
if ( DEFAULT.equals(str)) {
.....
}
}
위와 같이 했었다면, str로 null 이 오던 값이 오던 다 아무 문제 없이 실행이 된답니다.
참 간단한 팁인데, 프로그램의 안정성에 많은 도움이 되는 것이더군요.
그제서야 참 이상하게 비교를 한다고 생각하던 비교문이 단순히 이상한 것이 아닌
이유가 있는 사용법 이었더군요.
수고하세요!
맞아요
널포인터예외 안나오려면 상수 먼저 쓰면 되고요
근데 순서라는 함정이 또 개발자에게 생기는 것이라서..
toString()이 기본적으로 오버라이딩 되어있는 객체라면...
(""+문자열변수).equals 로도 많이 써유
아니면 아예 TextUtil이나 아파치 StringUtil 에 있는 함수한번 거치거나.. 그럽죠.. ㅎ헷
망구 제생각이었습니다 ㅋㅋ
문자열 비교에만 이런 적용이 되는건 아닌것 같아요.
if ( var == 3 ) 이라는 문장보다..
if ( 3 == var ) 라는 문장이 더 좋지요..
뭐..좋다기 보다는... if ( var = 3 ) 이런 실수를 많이들 하시는데,
아래의 방식으로 코딩을 하면, Compile time 에 이런 에러를 잡아주니까요. ^^
잠깐요. C 에는 equals <-- 이런게 없다는 건가요? 지금 C 배우는데 책을 아무리 뒤져도 이부분이 안나와서 설마..;;;
그럼 비교 어떻게 해요?
전 개인적으로는 상수가 앞에 오는 것을 사용하지 않습니다.
물론 윗 분들 말씀처럼 당장의 Null Exception은 막아지겠지만,
Null이 발생했을 때, 처리해줘야할 부분을 간과하고 다음 코드로 넘어가게 되버리는 거죠.
이게 일반적인 경우에는 별 문제가 되지 않을거 같으나, 결과적으로는 개발자의 코딩 그물을 벗어나게 되는 결과를 초래합니다.
저 같은 경우는 대체적으로 제가 만든 함수/메소드의 경우 일반객체를 제외하고 String을 반환할 경우엔 Null을 반환하지 않습니다.
empty string을 반환하고 있습니다. 만약 플랫폼에서 String에서 Null을 반환하는 경우는 무조건 Null 체크를 해서 Null일 때,
처리해야 될 부분을 명시를 한 다음에 Null이 아닌 경우를 처리합니다.
제 개인적인 생각이오나 당장의 Null Exception을 막을 순 있겠으나, 결국 개발자가 의도하지 않은 코드임은 분명하지 않나 생각드네요.
그리고....... 상수가 앞에오는 건 저도 예전 코더라서 그런지 보기 너무 어색합니다. ㅡㅡ; 차라리 final String 으로 잠시 변수로 만들고 쓰는게;;
오우 이런 디테일 한 팁이 있었군요. ^^
그냥 문자열 비교라길래 뭐 쉬운거 아닌가 했는데 다읽어보니 제가 실수로 했던 것들을 피할 수 있는 좋은 방법이네요.
음... 저 같은 경우 대학생때 Java라고는 한번도 하지 않았다가 현업에서 하게 된 케이스 인데요.
대학생땐 C/C++을 위주로 하다보니 shad0w 님 처럼 아에 empty string으로 무조건 초기화를 시켜서 작업을 하였기에 String에 대한 Null Exception을 생각지도 못했었죠.(저도 상수가 앞에 오는것이 어색한것도 있습니다. ㅎㅎ)
이런 것도 디테일하게 볼수 있어서 프로그래머 로써 다행이라 생각들며,
좋은 정보 감사합니다.
볼레로님이 말씀하신 장점 외에 코트 컴플릿2에 나오는 내용인데 저런 형태의 비교일 경우
if (str.equals(상수1)) {
} else if (str.equals(상수2) {
}
같은 여러번의 else if 시에 str이 앞에 오는 경우보다 상수가 앞에 오는 경우 코드 가독성이 더 좋아지죠