본문 바로가기
C.C++/전반

네이밍

by 겜게준 2017. 5. 6.

얼마전 Java언어를 사용하는 학교 과제를 하고 있었는데, 코드를 잠깐 보던 친구가 내 코드의 함수명을 보고 이렇게 말하였다...


Q : 너 변수명도 대문자로 시작하고 패키지명도 2번째 파일부터 대문자로 시작하는데 자바 컨벤션은 이렇게 하지 말라고 되어있는데 왜 이렇게 했니?




위의 링크로 들어가 보면 밑에 처럼 작성되어 있는 것을 볼 수 있을 것이다.


Naming conventions make programs more understandable by making them easier to read. They can also give information about the function of the identifier-for example, whether it's a constant, package, or class-which can be helpful in understanding the code. 


링크 - http://www.oracle.com/technetwork/java/codeconventions-135099.html


위의 내용은 자바의 네이밍 컨벤션 권고안이다.


위의 말대로 네이밍 컨벤션은 코드(프로그램???)을 읽기 쉽게 만듦으로써 이해하기 쉽게 만들어 준다. 여기서 중요한 것은 네이밍 컨벤션이라는 것이 하나로 정해져 있는 것이 아니란 것이다. 위의 링크에 나와 있는 것은 예로써 이렇게 하는것도 좋은 방법이라고 소개하는 권고일 뿐이다. 즉 중요한 것은 어떠한 것이든 컨벤션을 따름으로써 코드를 읽기 쉽게, 이해하기 쉽게 만드는 것이다. 내가 받았던 질문 같이 단지 표기법 같은 것을 따지라고 만들어 놓은 것이 아니란 것이다.






위에서 말한 것 처럼 네이밍 컨벤션은 코드를 읽기 쉽게 만들어 해당 코드를 이해하기 쉽게 만들어 준다. 처음 프로그래밍을 접한다면 네이밍 컨벤션에 대해서 그렇게 중요하다고 느끼지 못할 수 있을 것이다. 다음을 보자.


1) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL func(wchar_t ArgFirst[256], wchar_t(&arg2)[256])
{
    if (!(func2(arg1))) {
        wchar_t local[256= { 0 };
        _wsplitpath_s(arg1, NULL, NULL, NULL, NULL, NULL, NULL, local, 256);
        wcscpy_s(arg2, local);
        return 1;
    }
    else {
        wcscpy_s(arg2, NULL);
        return 0;
    }
}
cs

2)
1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL MyUtilFunc(wchar_t ArgFirst[256], wchar_t(&arg_2_Out)[256])
{
    if (!(func2(ArgFirst))) {
        wchar_t ThisIsTempOfVariableThatContainStringOfExtensionBlaBla[256= { 0 };
        _wsplitpath_s(ArgFirst, NULL, NULL, NULL, NULL, NULL, NULL, ThisIsTempOfVariableThatContainStringOfExtensionBlaBla, 256);
        wcscpy_s(arg_2_Out, ThisIsTempOfVariableThatContainStringOfExtensionBlaBla);
        return 1;
    }
    else {
        wcscpy_s(arg_2_Out, NULL);
        return 0;
    }
}
cs

3)
1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL GetFileExtensionFromPath(_In_ wchar_t filePath[MAX_PATH], _Out_ wchar_t(&extensionBuff)[MAX_PATH])
{
    if (!(PathIsDirectory(filePath))) {
        wchar_t tempBuff[MAX_PATH] = { 0 };
        _wsplitpath_s(filePath, NULL, NULL, NULL, NULL, NULL, NULL, tempBuff, MAX_PATH);
        wcscpy_s(extensionBuff, tempBuff);
        return 1;
    }
    else {
        wcscpy_s(extensionBuff, NULL);
        return 0;
    }
}
cs


아무튼 이런식으로 네이밍과 네이밍 컨벤션은 읽기 쉽게 만들고 함수나 변수의 목적을 한번에 알 수 있도록 힌트를 주는 역활을 할 수 있다.


뭐 하여튼 당장에 이해할 수 없어도 하다 보면 벽돌로 쳐버리고 싶은 코드들, 읽기 싫은 코드들을 잔뜩 볼 수 있을 것이다. 다른 사람이 아니라도 자기 코드에서도 볼 수 있을 것이다.


특히 내가 아니더라도 내 코드를 다른사람이 볼 때, 최대한 쉽게 이해할 수 있게 도와주는 것이 네이밍이라고 생각한다.


아무리 네이밍을 아주 좋게 작명을 하였다고 해도 힌트일 뿐, 네이밍만을 보고 이해할 수 있다고 생각하면 오산이다. 함수던 변수던 클래스던 역활에 대해서는 주석을 작성하는게 좋다고 본다.






카운터 변수같은 경우에도 i,j,k 대신에 arrIdx, outterIdx, curIdx 같은 이름으로 쓸 수도 있겠고 변수 앞에 접두사를 붙여서 변수 타입이나 사용용도를 암시할 수 있도록 할 수 있을 것이다. 그 외에도 멤버변수에 접근할 수 있도록 하는 메소드의 이름을 get, set으로 시작하는 게터와 세터로 정할 수 있고, 2어절 이상의 변수명을 구분하기 위해 대문자로 구분을 할 수 있을 것이다.




'C.C++ > 전반' 카테고리의 다른 글

RAII  (0) 2018.05.23
파라미터에서 Pointer, Reference  (0) 2017.06.22
다차원 배열  (0) 2017.06.20

댓글