Media Log

프로그램을 처음 배울 때는 거의 정신병자 수준으로 코딩 스타일에 집착했었는데 나이가 들어가면서 코딩 스타일에 조금씩 둔감해져가고 있다.
대학 때는 들여쓰기를 tab으로 했었는데 첫번째 회사에서 space가 규칙이라고 꼭 그렇게 쓰라고 강제했다. 나는 tab을 버리기 싫었지만 규칙을 어기지 않기위해 그렇게 쓰다보니 space가 너무 좋아져버렸다. 2번째 회사에서는 다시 tab을 사용하라고 한다. 좀 촌스럽네? 아직도 tab을 쓰는데가 있었나 정도의 생각은 들지만 거부감 없이 받아들일 수 있었다. 그 외의 다른 스타일들도 비슷하다.

그래도 여전히 눈에 거슬리고 바꿔버리고 싶은 욕구가 드는 C/C++ 코딩 스타일이 2가지가 있는데 그 중 하나는
if (0 == str.Length())
{
}
위처럼 상수를 좌측에 쓰는 코드이다.
프로그램을 읽기에도 불편하고 쓸 때 또한 불편한데 도대체 왜 상수를 왼쪽에 쓰는가.

아마 어떤 사람들은 그렇게 써야 == 연산자 대신 = 를 사용해버리는 실수를 방지할 수 있어요, 라고 대답할지도 모른다. 하지만 요즘 컴파일러는 이런 실수를 경고로 가르쳐주는 기능을 다 가지고 있는데 굳이 저렇게 쓸 필요가 있는가? 컴파일러나 정적분석툴의 도움를 받을 수 없는 상황에서나 어쩔수 없이 사용하던 구식 방법인데 이를 무작정 따라하는 사람들이 많다. 다음 코드는 조금 더 보기에 안좋다.
if (MAX_PATH <= str.Length())
{
}
'상수를 왼쪽에 써야 실수를 줄일수 있다고 했지'. 라고 생각없이 이 말을 받아들인 사람들은 == 이 아니라 비교연산자를 사용할 때에도 모든 상수는 죄다 왼쪽에 써버린다. 위 코드를 읽을 때 머리가 2번씩 돌아가는 것 같지 않은가?

또 한가지 싫어하는 C/C++ 스타일은
bool xxx = fOk;
if (xxx == true)
{
}
이렇게 불린 테스트를 true나 false와 명시적으로 비교하는 것이다.

아래 strcmp 함수의 경우 처럼 표현식의 결과가 불린 값이 아닌 경우에는(strcmp의 리턴값은 정수이다) 같은 타입으로 명시적으로 비교를 해서 표현식을 참 혹은 거짓으로 맞추어 주는 것이 의미가 있다.
if (!strcmp(xxx, yyy)) // 이보다는
if (strcmp(xxx, yyy) == 0) // 이게 더 낫다고 생각한다.
하지만 이미 어떤 변수나 식이 이미 참과 거짓을 나타내고 있다면 또 다시 그것을 true나 false와 비교하는 것은 명백한 중복이다. 나는 그런 경우는 그냥
if (xxx)
{
}

또는
if (!xxx)
{
}
이렇게 쓰는 것을 선호한다.

위에서 처럼 true와 비교하는 것보다 1로 정의된 대문자 TRUE를 비교하는 것은 훨씬 나쁘다.
if (xxx == TRUE)
{
}
xxx 값이 0도 아니고 1도 아닌 값(하지만 참인)을 가진 경우에는 골탕을 먹게 되기 때문이다.

오늘 stackoverflow를 구경하다가 재밌는 사실 하나를 알게되었다.
많은 사람들이 나만큼이나 위 두가지 스타일을 싫어한다는 것이다.
어떤 코딩 스타일이 가장 거지같다고 생각하나요?

내가 위에서 말한 2가지 스타일이 1등과 3등을 차지 했다니 아마 저런 스타일을 사용하는 사람들은 잘 믿기지 않을 것이다.
재밌는 답변과 댓글들이 많으니 관심있는 사람들은 위 포스트를 한번 읽어보기 바란다.
나는 아래 댓글이 가장 재밌고 인상적이었다.
Damn. We say "if it's raining, open your umbrella" and NEVER "if it's true that it's raining, take your umbrella"... Testing explicitely against boolean is as verbose and as un-natural as the second example
저작자 표시 비영리 동일 조건 변경 허락
신고
  1. Favicon of http://eslife.tistory.com BlogIcon esstory at 2011.10.29 14:55 신고 [edit/del]

    상수를 앞에 쓰는 건 이제 손에 익어서 항상 지키게 되는데 ㅎㅎ
    컴파일러가 좋으니 이제 이런 학습들도 구닥다리가 되는거네요 ㅎㅎ

    Reply
    • Favicon of http://www.benjaminlog.com BlogIcon 김재호 at 2011.11.02 09:58 신고 [edit/del]

      네, 책에서 (또는 다른 사람이) 말하는 내용을 그대로 믿지말고 한번 잘 생각해보고 걸러서 받아들이는 자세가 중요하다고 여기어집니다.

  2. Favicon of http://blog.spowner.com BlogIcon spowner at 2011.12.01 11:00 신고 [edit/del]

    안녕하세요.
    저같은 경우도 0 == xxx 싫어합니다. 사람이 사람보기 편하게 코딩해야지 이건 뭥미.. 텍스트에디터로 코딩하는것도 아니고.. 상수도 마찬가지.
    하지만 저는 명시적으로 true/false를 적어주는것을 선호합니다. 다양한 언어들을 접하고 사용하다보니 명시적으로 적지 않으면 제가 눈에 확 안들어오더라고요

    Reply
  3. subong at 2012.01.31 12:29 신고 [edit/del]

    if문의 경우 true를 쓰지 않는 부분에 대해선 공감합니다만
    false의 경우엔 !를 사용하는경우 상황에 따라 눈에 잘 안들와
    잘못 읽는 경우도 생기는 갓 같아 false인 경우에는 명시적으로 쓰고있네요.
    if (!variable)
    =>
    if (variable == false)

    Reply
    • Favicon of http://www.benjaminlog.com BlogIcon 김재호 at 2012.01.31 19:06 신고 [edit/del]

      if (variable == false)는 전혀 문제가 없고 보기에도 좋은 코드입니다.
      if (!variable) 도 역시 보기에 좋습니다.

      이런 경우에 저는 최대한 다른 사람들이 많이 사용하는 스타일을 사용하려고 합니다. 이렇게 하면 많은 경우에 유리합니다. (특히 스타일을 가지고 누군가 따질 때. C/C++하는 사람들이 흔하게 맞게 되는 일이죠)
      C/C++ 세계에서는 if (boolean_variable == false)보다는 if (!boolean_variable) 이라고 생각이 되어요.

  4. gcd at 2012.02.22 06:47 신고 [edit/del]

    안녕하세요. 혹시 스캇형이 EC++11을 내놓지 않았을까, 하는 정보를 찾아 헤매다 들렀습니다.
    처음(?) 들렀다 생각했는데 변수 자리에 놓는다는 typedef 관한 글을 봤던 기억이 나네요.

    어쨌든, 말씀하신 스타일이 저와 매우 비슷해서 그냥 지나갈 수가 없겠더군요 ^^;
    은근한(?) 스페이스의 매력이 있는 것 같습니다. (웹쪽에서는 사이즈적인 손해가 좀 있지만 크게 신경 쓸 것도 아니고...)

    0 == foo는 좋다길래(?) 따라해보려 했지만 몸이 거부했기에 결국 포기하고 말았었네요.
    (마침 최근 댓글에 조엘에 관한 것이 있어서 떠오르는데, 그 사람도 '정말 효과가 있든 없든' 그런 방어적 프로그래밍 습관을 가진건 좋은 징조라고... 면접하는 법이었나... 거기에서 그랬던 것 같네요.)

    저는 bar == true는 보고 있으면 피부에 뭔가 기어가는 기분이 드는군요. (return 타입 bool일 때 int를 바로 넘기면 경고 뜨는 걸 보는 기분으로요...)
    하여간 if ( a && b == true ) 같은 상황이 되어버리면 연산자 우선순위까지 괜히 헷갈려서 좋지 않은 것 같습니다.

    가독성 면에서는 if (! boo) 하고 ! 다음에 공백을 하나 주는 것도 괜찮을 것 같네요.
    여기에 목숨 걸면 #define if_not(x) if (!(x)) 해놓고 쓰는 것도 나쁘지 않을지도..(후자는 농담입니다 ㅠㅠ)

    Reply
    • Favicon of http://www.benjaminlog.com BlogIcon 김재호 at 2012.02.22 10:16 신고 [edit/del]

      예, 조엘이 면접하는 법에서 그런 말을 했었죠.
      1. 상수를 좌측에 쓰면 좋은 징조이다
      2. C++에서는 소멸자를 항상 가상 소멸자로 선언해야한다.

      저는 조엘 온 소프트웨어를 아주 재밌게 읽었고 거의 모든 내용에 동의하는데 딱 저 2가지에 대해서만은 반대입니다^^

submit