자바 if(param.equals("Y")) 이냐 if("Y".equals(param)) 이냐... 프로그래밍

if(param.equals("Y")) 이냐 if("Y".equals(param)) 이냐 의 문제

처음 프로그램을 배웠을때

난 첫번째 방법을 사용하였다

IF(param.equals("Y")) 로 항상 사용하였는데 이방법을 사용하 였을때 

매번 발생하는문제의 90% 이상은 param 값이 NULL 이 들어왔을 경우이다

NULL 이 들어오게 되면 NullPointerException 문제가 발생했다

사실 금방 고칠 수 있게 되기도 하지만 코드가 길고 뷰단에서 문제가 생긴다면 의외로 시간이 걸리기도 하는 문제이다




그래서 인터넷을 검색하던중 두번째 방법을 알게되었다

두번째 방법은 IF("Y".equals(param)) 이라는 방법이었는데 

param에 값이 NULL 이 들어올 경우라도 NullPointerException 에러가 발생하지 않고 

else 문을 실행시키게 된다

오~ 오~ 신세계를 만난느낌이랄까..











그러다가 인터넷 검색중에 어떤 글을 보았다

============================================

if ("Y".equals(param)) doSomthing();

else doOther();


이런 코드는 조심해서 써야 한다. param의 null체크가 귀찮아서 이런식의 코드를 쓰곤 하는데

 

만약 param의 값이 Y인 경우는 doSomething()을 실행하고 N이나 Null이면 doOther()를 실행해야

 

하는 경우라면, 이 코드는 문제가 없다. 그러나 만약 param은 null이면 안되는 상황이라면, 어떻게

 

될까? 다른 부분의 버그로 param에 null이 들어와도 프로그래머는 이것을 알아 차리지 못하고

 

넘어가게된다. 즉, 버그를 은폐하는 코드가 된다. 당장의 문제를 발생하지 않더라도 이런 코드는

 

나중에 찾기 힘든 문제를 유발할 수 있다. 이런 경우는 그냥 ?NullPointerException이 발생하도록

 

내버려 두면 param에 null값이 들어왔을때 다른 부분에 버그가 있기 때문이라는 사실을 감지 할 수

 

있다. 상황에 따라 위와 같은 코드를 써도 되는지를 신중히 검토한 후 사용해야 한다. 예외 발생이

 

두려워서 버그를 은페할 수 있는 코드를 만들지 말자.


=====================================================



사실 맞는 말이다.... 잠재적인 버그를 고치지 않는 문제는 확실히 문제니까


확실히 고민좀 해봐야할 문제다

다른 프로그래머분들은 어떤 코드를 더 선호하시는지 알고싶어진다랄까...여러분은 어느쪽인가요??


ps1. 여러의견 감사합니다 혹시 덧글다실때 어느쪽 프로그램에 종사하고 계시는지도 적어주셨으면 조금 더 좋은 글이 되지않을까 합니다 ^^a
(웹 이라던가...CS 라던가....)




트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://nestofeagle.egloos.com/tb/1501427 [도움말]

덧글

  • 게드 2011/06/10 14:41 # 답글

    항상 null 체크를 해야죠 ... 속도가 필요하면(if 빠지는게 얼마나 빨라질지는 모르지만) 디버그 모드일때만..
  • 아길라스 2011/06/10 17:23 #

    답변 감사합니다 Null 체크도 맞다고 생각합니다
    그렇다면 선택지가 두가지 일때도 매번 Null 체크를 하시는지 궁금합니다
  • 게드 2011/06/10 17:27 #

    예전 직종에선 전부 null체크를 했고..(보안모듈쪽이라)
    지금은 로직상 발생할 수 있는 부분에만 체크를 하고.. Thread를 Try로 잡아버립니다..;;
  • 아길라스 2011/06/10 17:36 #

    try 로 처리하는 방법
    유용하게 사용한다면 좋은방법인거 같습니다
    자바의 장점중 하나이니 많이 써먹어야죠^^
  • 무혼마 2011/06/10 14:43 # 답글

    저도 전자의 방법에 null 체크를 먼저 하곤 합니다 (...)
  • 아길라스 2011/06/10 17:23 #

    답변 감사합니다 Null 체크도 맞다고 생각합니다
  • 권스 2011/06/10 16:03 # 삭제 답글

    전자를 사용합니다. 에러가 감춰지는 것이 더욱더 무서운 사태가 벌어지니까요.;
  • 아길라스 2011/06/10 17:24 #

    답변 감사합니다
  • YoUZen 2011/06/10 16:22 # 답글

    전자를 사용해요. 가능하면 애초에 널값이 안나오도록 만들지만요.
  • 아길라스 2011/06/10 17:24 #

    답변 감사합니다

    널값이 않나오는 방법으로는
    변수의 값을 초기화하신다는 것인가요?
    아니면 넘겨주는 쪽에서 Null을 체크하시나요?
    어떤 방법을 주로 사용하시나요?
  • 랜덤여신 2011/06/10 16:47 # 삭제 답글

    후자입니다. 제가 보기에 equals(), 즉 ==은 두 피연산자의 값이 같은지 알아보는 연산이지, null인지 확인하는 연산이 아닙니다.

    만일 param에 들어갈 값으로 Y와 N만 올바르다면, param에 null이 들어가는 게 틀린 만큼이나 "gahlega"나 "hwelhw"가 들어가는 것도 잘못된 겁니다. 그러나 이걸 다 확인하는 건 불가능하고, ==이 그것들을 검사해주지도 않죠. 따라서 ==이 null 검사까지 추가적으로 해버리는 것은 의미론적으로 맞지 않다고 봅니다.

    equals()가 null일 때 예외를 발생시키는 것은, (1) 모든 함수가 가상 함수라서 null 객체에서 함수를 호출할 수 없고, (2) == 연산 호출이 문자열 객체에 의존적인, 자바의 부작용이라고 생각합니다.
  • 아길라스 2011/06/11 15:48 #

    답변 감사합니다

    저도 같은 의견이었는데 많은 분들의 이야기를 들으니 또 다른생각이 약간 드네요 ^^
  • 밀리네스 2011/06/10 17:46 # 답글

    if ("Y".equals(arg)) {
    doYes();
    }else if ("N".equals(arg)){
    doNo();
    }
    else {
    throw new IllegalArgumentException("Can not hande arg");
    }
  • 아길라스 2011/06/11 15:49 #

    마지막의 else 로 예외처리 방법이라 jsp 에서도 try를 사용하기 곤란할때 사용할 수 있것 같습니다
  • sneeki 2011/06/10 22:22 # 삭제 답글

    널체크를 해야죠~
    StrUtil 같은거 만들어 두시고, null 인지 사이즈가 0인지 체크하는 메서드 넣어두시고,

    if(StrUtil.isNotNullOrEmpty(arg)){
    if(arg.equals("응응?")){
    ~~~~~~~~~~~~~~~~~~
    }
    }
    이런식으로~?^^
  • 아길라스 2011/06/11 15:51 #

    isNotNullOrEmpty 라는 메소드는 null과 사이즈를 동시에 체크하시는 메소드이신가요?

    저는 따로 자주 사용하는 메소드들을 특별히 모아두지 않고있었는데 이기회에 한번 작성해서

    사용해겠습니다 ^^
  • 미루엘 2011/06/11 23:12 # 답글

    좀 .. 다른 이야긴데..

    최근에 C/C++에서 == 오퍼레이터의 사용 시의 권장 사항은 "상수 먼저"입니다.
    if (a == 1) 말고, if(1 == a) 를 써라.. 는 거죠. 이유는 if (a = 1) 이라고 잘 못 썼을 때 컴파일타임에 잡아 내기 위한.. 뭐 요즘은 컴파일러가 워닝을 내주지만.. 워닝 무시하는 사람도 많고.. if (1 = a)는 명백하게 에러로 떨어지기 때문이죠.

    하지만, 언급하신 케이스는.. 다른 이야기 입니다. Null인지 여부와, 같고/틀림 이라는 두개의 오퍼레이션을 동시에 하는 것으로.. 이건 명백하게 사이드이펙트를 '이용'하고 있습니다. 인용하신 글에서 우려하는 상황이 발생할 수 있습니다.

    저의 생각은 a = ++i; 와 ++i; a = i; 와 (는 분명히 다른 문제 입니다만...) 같은 문제로 봅니다. 당연히 나누어 처리해야 하는 문제로..

    PS. 저는 임베디드쪽에서 코딩으로 밥먹고 살고 있습니다. C/C++을 많이 해왔지만, 최근엔 안드롱 때문에 자바를 좀 하고 있지욤.
댓글 입력 영역