메아리 저널

내 코딩 규칙에 대한 생각

내가 짜는 C/C++ 코드를 유심히 봐 왔던 사람이라면 내 코딩 규칙이 항상 일정하다는 것을 알 수 있을 것이다. 아 물론 이미 코딩 규칙이 잡힌 코드(회사에서 작업하는 것 같은…)라면 예외지만. 대강 이렇게 생겼다.

class Derived : public Base
{
public:
    int foo() { return 42; }

    void bar()
    {
        doSomething1();
        if (cond()) {
            doSomething2();
        } else {
            doSomething3();
        }
    }
}

이런 규칙을 언제부터 써 왔는지는 나도 기억이 안 난다. (3~4년은 된 것 같다.) 코딩 규칙 중에서 특히 논란이 심해 매일 플레임을 불러 일으키는 중괄호의 위치에 대해서는 난 다음과 같은 규칙을 쓰고 있다.

  • 한 줄에 확실히 끼워 맞출 수 있는 게 아니라면 항상 중괄호를 사용한다.
  • 클래스와 함수에서는 중괄호를 각각 별도의 줄로 빼 내고 선언과 같은 열에 정렬한다.
  • 아니면 (조건문, 네임스페이스 등등) 시작 중괄호는 선언과 같은 줄에 붙여 쓴다.

왜 하필 클래스와 함수에서만 별도의 줄로 빼 내는가? 하면… 가장 그럴듯한 이유는 새로운 변수 scope를 만든다는 점이 될 것 같다. 물론 조건문 등도 나름 지역 변수를 만들 수 있긴 하지만 클래스나 함수만큼 강력한 scope는 아니다. 따라서 어떻게 보면 알려진 변수들의 집합이 싹 바뀔 시점에서 시각적인 효과를 위해 새 줄로 나누는 거라 할 수 있겠다.

비슷한 종류의 플레임 거리로 함수 호출이나 조건문 등에 쓰이는 괄호 앞에 공백을 쓸까 말까의 여부가 있다. 나는 이렇게 쓰고 있다.

if (foo + bar > 0) {
    somefunc();
    return sizeof(int);
}

조건문 같이 여러 문장을 묶는 데 쓰이면 공백을 쓰고, 함수 호출과 비슷하게 생겼으면 (sizeof는 함수 호출은 아니지만 비슷하게 생겼다) 공백을 안 쓰는 것이다.1 이렇게 구분을 해 놓으면 문법 강조를 안 한 상태에서도 코드를 보기가 좀 더 쉬워지는 기분이 든다.;; (정말로 그런지는 모르겠다.)

‘일반적으로’ 괄호 앞에 공백을 붙이지 말아야 하는 이유는 따로 있다. 다음 예를 생각해 보자.

foo ()->bar [42]->blah;
foo ()->bar ()->get_blah ();

메소드를 사슬처럼 연결해서 쓸 때 -> 앞뒤에는 공백이 안 들어 가는 경우가 보통이다. 그런데 괄호 앞에 공백을 쓸 경우 원래 의도와는 반대로 코드가 뭉쳐 보이는 (이 경우 ()->bar 같은 것들이 따로 놀게 된다) 현상이 생기게 된다. 과연 이런 현상을 감수하고서라도 얻는 장점이 뭐가 있는지는 내가 저 규칙을 많이 안 쓰기 때문에 잘 모르겠다.

뭐 이런 저런 이유로, 내가 쓰는 코딩 규칙에 대해서 왜 선호하는지에 대한 얘기를 써 봤다. 이미 자기 나름대로 잘 만들어 쓰고 있는 사람이라면 상관 없겠지만, 아직 코딩 규칙을 별로 안 정해 본 사람에게 이 글이 조금이나마 도움이 되었으면 한다.


  1. 같은 이유로 D의 static_assert는 런타임에 실행되지도 않고 언어 구조에 속하지만 앞에 공백을 쓰지 않는다.

이 글은 본래 http://mearie.org/journal/2008/06/my-argument-to-coding-convention에 썼던 것을 옮겨 온 것입니다.


(rev 1d46270eb038)