int const i; C++ 오른쪽 const 표기 컨벤션

· by 박승재

대부분의 프로그래밍 언어에서 const 키워드는 타입의 왼쪽에 표기되지만, C와 C++에서 const는 다른 언어들과 다르게 타입의 오른쪽에도 표기할 수 있습니다. 이번 글에서는 타입의 오른쪽에 const를 표기하는 코딩 컨벤션을 소개해 드리겠습니다.

const int i = 100;
int const i = 100;

2가지의 선언은 완전히 동일한 선언입니다.

const를 오른쪽에 표기하는 코딩 컨벤션은 C++ 템플릿 가이드(C++ Templates: The Complete Guide)에서 소개되었습니다.

이 책에서는 const를 오른쪽에 작성해야 되는 컨벤션의 근거로 2가지 이유를 제시했습니다.

가독성

첫 번째는 가독성입니다.

대부분의 언어에서 왼쪽에 const를 붙이므로 오히려 가독성을 해하는 것이 아니냐고 반문하실 수 있지만, C/C++에서의 const규칙이 조금 다릅니다.

C/C++ const 적용 규칙:

const는 기본적으로 오른쪽에서 왼쪽으로 수식하되, 왼쪽에 수식 대상이 없을 때왼쪽에서 오른쪽으로 수식한다.

const int i = 100; // (1)
int const i = 100; // (2)

1의 경우는 const 왼쪽에 아무런 수식 대상이 없기 때문에 오른쪽에 위치한 int를 수식합니다.

2의 경우는 const왼쪽int가 있기 때문에 int를 수식합니다.

여기까지만 보면 크게 가독성이 향상되는 것 같지 않지만, 만약 포인터가 들어오면 상황이 달라집니다.

const char *const s = "abcd"; // (1)
char const *const s = "abcd"; // (2)

1의 경우, 첫 번째 const오른쪽char을 수식하지만 두 번째 const왼쪽*을 수식합니다. 즉, 한 선언 안에 수식하는 방향이 다른 const가 혼재하게 됩니다.

2의 경우, 두 const 모두 자신의 왼쪽에 있는 char*를 각각 수식하게 됩니다.

함수 포인터 등으로 식이 복잡해질수록 타입의 오른쪽const를 표기하는 컨벤션은 가독성에 유리하게 작용합니다.

alias 선언에서의 직관성

코드에 아래와 같은 type alias가 있다고 가정합시다.

typedef char *CHARS;

타입의 왼쪽const를 붙이는 컨벤션을 고집해, 새로운 타입을 선언한다면 아래와 같이 표현할 수 있습니다.

typedef const CHARS CONST_PTR; // (1)

이는 아래의 표현과 같습니다.

typedef const char *CONST_PTR;

const는 오른쪽의 char를 수식합니다.

일반적인 관점에서는 포인터의 aliasconst를 붙였으므로 상수 포인터(const pointer)가 되는 것이 맞습니다.

하지만, 위는 상수 포인터가 아닌 상수 문자(const char)을 가리키는 일반 포인터입니다.

이번에는 타입의 오른쪽const를 붙여 표현합시다.

typedef CHARS const CONST_PTR; // (2)

이는 아래의 표현과 같습니다.

typedef char *const CONST_PTR;

const는 왼쪽의 *을 수식합니다.

우리의 직관대로 CONST_PTR는 문자(char)을 가리키는 상수 포인터가 되었습니다.

결론

타입의 오른쪽에 const를 표기하는 컨벤션은 분명 익숙하지 않은 규칙입니다.

하지만, C/C++의 차이점을 받아드리고 새로운 규칙에 적응한다면 읽기 좋은 코드를 작성하는 데도 도움이 될 것입니다.

저도 오른쪽 const 표기법이 분명 강점이 있다고 생각하기에 블로그에 기록하여 추천해 드리는 바입니다.