코딩을 안정적으로 하기위해 자신의 코딩스타일에 대하여 한번은 정립하는 시간이 필요하다.

 

먼저 코딩 스타일은 사람에 따라 호불호에 차이가 있고 또 그룹(속해있는 커뮤티티)에 따라 차이가 있다는 점에서 시작하면 좋을 것 같다.

 

코딩 스타일에는 어느정도 사람의 개성이 반영되어 있다. 한편 기업의 코딩 가이드라인이 따로 있는 경우 개인의 코딩스타일을 사용해서 프로그램을 작성할 수 없다. 규칙에 안맞는 코딩 방법은 팀원간 의사소통을 어렵게 하기 때문이다.

 

여기서 다루는 주제는 일반적인 코딩 스타일이다. 혹은 Coding Convention 이기도 하다. 코딩 컨벤션은 특정 언어에 대한 일정한 가이드라인이라고 볼 수 있다. 파이썬의 PEP8 coding style 이 하나의 예가 된다.

 

코딩스타일에 대한 주제들은 반복해서 나온다.

 

1. 언어 선택

 

- 코딩 스타일은 어떤 언어를 선택하느냐에 따라 달라진다. 문법체계가 달라지기 때문에 당연한데 하나의 언어에서도 여러개의 스타일이 나올 수 있다. 아무래도 고인물과 전설이 많은 C와 C++ 스타일이 가장 세분화 되어 있다. 예를들어 중괄호를 사용할 때 BSD style 이나 K & R style 로 나뉘어져 있다. 그것이 프로그램 실행과는 상관이 없지만 코드를 읽는 가독성에 차이가 나기 때문에 보는 사람에 따라 민감한 문제가 되기도 한다.

 

* 링크 - C and C++ Style Guides (maultech.com) C와 C++의 스타일 가이드

 

중괄호를 사용하지 않고 들여쓰기(indentation)만으로 블록을 구분하는 파이썬 같은 언어도 있다. 이런 경우도 스타일이 달라지기 마련이다. 다행히 파이썬에는 PEP8이라는 파이썬 커뮤티티 가이드 라인이 있다. 예를 들어 들여쓰기는 스페이스 문자 4개를 사용하라 혹은 tab을 사용하라 (IDE에 따라 다름)는 식의 가이드가 있다. 그런데 요새는 IDE가 지원을 잘해주기 때문에 코딩하면서 이런 부분에 크게 신경쓰거나 그럴일은 많이 줄었다. PyCharm 같은 IDE에서는 코드를 작성하다 블록을 구분하는 라인에 들어가면 자동으로 들여쓰기 간격을 조정해준다. 특정 언어의 코드를 정렬해주는 플러그인들도 있다. 그럼에도 불구하고 최종적으로 코드를 손봐야 하는 것은 프로그래머가 해야하기 때문에 코딩 스타일은 중요하다.

 

2. 이름 짓기(Naming Convention)

1) 카멜케이스 : Camel Case

 

- 이름 지을 때 보통 camelCase를 사용한다. 마치 낙타의 등이 언덕이 솓은 모습 처럼 생겼다고 하여 붙여진 이름이다.

 

두개 이상의 단어에 사용한다. 첫글자는 소문자 다음 단어는 대문자이다. 카멀케이스를 쓰면 한 단어로 된 변수의 이름도 소문자를 사용하여 일관성을 준다.

int studentNumber

2) 파스칼케이스: Pascal Case

 

- 파스칼케이스는 카멜케이스와 달리 변수의 첫글자를 대문자로 시작한다.

int StudnetNumber

3) 스네이크케이스 (snake case)

 

- 스네이크 케이스는 뱀이 기어가는 모양같다고 해서 붙여진 이름이다. 이제 보니 프로그래머들은 동물을 좋아하는 것 같다. 기본은 소문자이다.

int student_id

 

4) 헝가리안표기 (Hungarian notation)

 

- 헝가리식 표기법은 변수명 앞에 자료형을 붙여주는 방식이다. 접두사에는 ch, str, b, arr 등이 다양하게 있다. ch 는 char, str은 String, b는 byte 등 워낙 생략이 많이 되어 있어서 규칙에 대하여 공부를 해야한다.

 

마이크로 소프트의 윈도우 애플리케이션 개발과정에 많이 사용되었는데 그 영향인지 WIN32 API 에 lpsz 같은 접두어가 붙은 변수명이 유난히 많다. 최근에는 동적 타입 프로그래밍 언어의 보급으로 이렇게 타입에 집착하는 언어의 인기는 좀 줄어들은 것 같다. 자바 정도는 C++에 비하면 매우 단순한 구조로 보인다. 동적 타입언어는 이런 표기 자체를 할 수가 없다. 왜냐하면 프로그래머가 타입을 결정하는게 아니라 컴파일러(인터프리터)가 자료타입을 추정해서 할당하기 때문이다.

String strName;

char ch1;

byte bAge;

 

* 딱 네가지가 끝이 아니라 위 네가지를 서로 조합해서 또 여러가지 조합방식이 나올 수 있다. 

 

구글의 스타일 가이드 같은 웹문서를 보면 각각 기업에 따라 언어에 따라 스타일 가이드를 깃허브에 오픈해두었으니까 참고를 하면 좋을 것이다. 아무래도 너무 옛날에 만들어진 코딩 스타일보다는 최근의 트렌드를 반영한 스타일의 소스코드가 더 소통이 쉬울 것이다.

 

*링크 - 구글 스타일 가이드 : Google Style Guides | styleguide

 

위의 구글 C# 스타일 가이드를 보면 namespace는 파스칼케이스, parameters 매개변수나 지역변수는 캐멀케이스, 속성(property)은 _캐멀케이스 ... 자세하게 기술되어 있다.

 

이 외에도 HTML, SWIFT 등 구글에서 사용되는 다양한 스타일이 공개되어 있으니 구글이나 관련 회사에 취업을 준비하는 사람이 봐두면 좋다.

 

꼭 구글에 입사가 목적이 아니더라도 구글같이 세계적 기업의 코딩 스타일을 배워둔다면 공부가 될 것이다. 구글 스타일을 적당히 참고해서 자신의 코딩 스타일을 만들어도 괜찮을 것 같다. 당연하지만 코딩 스타일이 언어마다 기술되어 있다. 이는 언어마다 문법이 다르고 특성이 다르기 때문에 스타일도 그에 따라 최적화 시켜야 한다는 것으로 이해할 수 있다. 또는 여러사람이 많이 보거나 유지보수가 더 많은 코드의 경우 좀 더 협업과 커뮤니케이션을 강조해야 하는 부분이 있을 것이다.

 

3. 상수 스타일 (Constant)

 

상수는 프로그램 실행도중에 변하지 않는 수이다. 만약 상수가 변수와 비슷하게 생겨서 값을 변경하려는 경우가 생길 수도 있다. 상수로 값을 설정하는 것은 프로그램의 안전성을 위해 꼭 필요한 일이다. 보통 대문자로 표기해서 상수와 변수를 구분한다.

 

다음과 같이 대문자와 언더바를 같이 사용하는 방법등을 사용할 수 있다.

MAX_STUDENT

C언어의 매크로 상수를 보면 대문자를 사용한다. C언어를 계승한 다른 언어들도 이 영향을 받아서 대문자로 쓰는 경우가 많다. 파이썬의 경우 상수 선언을 위한 키워드는 없지만 상수 이름을 대문자로 쓰고 값을 튜플로 대입하면 튜플 안의 요소에 대입을 하지 못하기 때문에 그런 방식도 사용한다.

 

4. 들여쓰기(Indentation)

들여쓰기는 코드블록을 구분하는 기준이 된다. 파이썬은 들여쓰기에 엄격하기 때문에 한칸이라도 들여쓰기가 잘못되면 오류가 난다. (문법이 유연한 파이썬에서도 엄격히 따지는 기준이다)

 

블록을 구분하는 들여쓰기는 공백문자(space) 4칸이다. 중괄호만 쓰다가 여기로 넘어오면 이쪽이 신세계로 보일 수 있다.

 

for i in range(10):
    print(i)
    if i == 5:
        break

파이썬에서 들여쓰기는 선택이 아닌 필수사항이다. 사실 들여쓰기의 칸을 몇개로 할 것인지 까지는 정해지지 않았다. 실제 2개나 3개 공백을 넣어도 코드가 작동한다. 그러나 PEP8은 공백문자 4개를 권장한다. 누구는 2개 넣고 누구는 4개 넣고 이러면 코드를 읽기가 더 힘들어진다. 컴퓨터 입장에서 힘든일은 없겠지만 코딩하는 사람이 힘들어진다. 그래서 일반적인 가이드가 있는 것이다.

 

5. 중괄호 (code block)

C스타일의 언어는 중괄호로 블록을 나누는데 파이썬 처럼 들여쓰기를 하지 않아도 된다. 그럼에도 불구하고 들여쓰기로 정리를 해주는 것과 안하는 것은 가독성의 차이가 난다.

 

아래는 좀 거시기한데 함수 전체는 K & R 스타일로 묶고 while 문은 BSD 스타일로 중괄호를 묶었다. 이것도 함수 이름에는 K & R 을 적용하고 while if for 문 같은 제어문에는 BSD를 적용한다고 규칙을 세우면 안될 일은 아니긴 하다. 요는 일관성이 중요하다는 말이다.

 

컴퓨터가 소스코드를 컴파일할 때는 인간들의 그런 고민들과 전혀 상관없이 진행한다. 코딩 스타일을 만들면서 인간에게 중요한 것과 CPU에게 중요한 것을 구분하는 분별력도 자연스럽게 길러진다.

void showList(Node *list){
	Node *cur = list->next;
	printf("[ ");
    
	while(cur != NULL)
	{
	    printf("%d, ", cur->data);
	    cur = cur->next;
	}
    
	printf("]\n");
}

 

* 코딩스타일에서 중요한 부분들을 알아봤다. 그런데 이것만으로 끝난게 아니다. 세부적으로 들어가면 아주 많은 것들을 고려해야 하는데 코딩을 짜는 것을 목적으로 두기보다는 어떻게 하면 코드의 효율을 올리고 프로그래머들간의 커뮤니케이션을 원활하게 할까? 를 생각한다면 지루하기만한 코드가 조금은 다르게 보인다.

 

인터넷과 깃허브에는 이런 자료들이 많으니까 타인의 스타일도 참고하면서 자신의 코딩 스타일을 정립해 나간다면 좋은 프로그래머가 될 수 있을 것이다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band