표기법 정리 및 통일

1.Variable 과 Method의 표기 방법


변수나 함수, 유형(Type)은 띄어쓰기를 허용하지 않는다. 만약 이들의 이름을 여러 단어를 이어서 짓고 싶다면 띄어쓰기 없이도 각 단어를 알아볼 수 있는 방법이 필요한데, 이를 위해 다양한 방법이 사용되고 있다.


1.1 카멜 표기법


int messObject

중간 대문자라는 말로도 불리우며, 첫 단어의 시작은 소문자 이어지는 단어들의 첫 글자는 대문자로하여 낙타와 같은 모양을 하고 있어 카멜 표기법라고 불리운다. Java에서 변수나 함수 이름에 이를 사용하고 있으면, 다른 언어에서도 쓰여진다.


1.2 파스칼 표기법


int MessObject

각 단어의 첫 글자를 대문자로 표기한다. 첫 단어의 첫 글자도 대문자로 표기한다.(요즘은 이것도 카멜 표기법이라고 불리운다.) 구분해서 부를 때는 파스칼은 upper camel case라고 불리고, 카멜은 lower camel case라고 부른다. C#은 변수 이름만 카멜 표기법을 사용하고 메서드 이름이나 클래스 이름은 파스칼 표기법을 사용한다. 또는 기본 유형은 카멜 표기법 또는 스네티읔 표기법을 사용하더라도 사용자 정의 유형은 파스칼 표기법을 사용하기도 한다.


1.3 헝가리안 표기법


string strMessObject

영어로는 대소문자를 뜻하는 case 대신에 표기법을 뜻하는 notation을 사용하였는데, 이는 대소문자 문제가 아니기 때문이다. 파스칼 표기법처럼 첫 단어를 포함해서 모든 단어의 첫 글자를 대문자로 하되, 그 앞의 변수의 유형을 뜻하는 약어를 소문자로 붙여 준다. 정수형이라면 i, 문자열이하면 str을 붙이는 식이다. 이 방법을 처음 고안한 마이크로소프트의 개발자가 헝가리인이었기에 이런 이름이 붙었다. 현재는 잘 사용하고 있지 않고, 사용하지 말라고 권고도 많이 하고 있지만, 오픈 소스 저장소에 올라와 있는 구글 코드 중에는 여전히 이를 사용한 코드가 종종 보인다고 한다.


1.4 스네이크 표기법


int mess_object

뱀이 기어다는 모습과 비슷하다해서 붙은 이름으로 모두 소문자로 쓰고, 띄어쓰기를 밑줄(_) 기호로 대체하였다. C,C++과 같은 언어에서 많이 사용한다. 변수나 함수, 유형, 클래스 이름은 소문자를, 상수 밑 매크로 이름은 대문자를 사용하는게 관례라고 한다. Java도 static final 변수와 enum 값 이름에 대문자 스네이크 표기법을 사용한다.


1.5 기타


코드 블록 및 블록의 단계를 표시하는 방법으로 들여쓰기가 아주 널리 쓰이고 있다. 그런데 이 들여쓰기를 탭으로 할지 빈칸 문자로 할지에 관한 문제가 있다. 과거에는 탭 문자를 종종 썼지만 탭 문자는 편집기의 설정에 따라서 들여쓰는 칸수가 달라지는 단점이 있다. 빈칸 문자로 채우면 어떤 편집기에서 열든 똑같은 칸수만큼만 들여쓰기가 된다는 게 장점이지만 탭 문자는 한 단계에 한 개만 들어가는 데 반해 빈칸은 들여쓰는 칸수만큼 문자가 들어가야 한다. 저장장치의 용량이 빡빡했던 시절에는 탭 문자가 데이터 용량을 줄여주는 효과를 무시할 일이 아니었기 때문에 탭 문자를 많이 썼지만 지금은 빈칸 문자를 사용하는 방식이 널리 쓰이고 있다. 요즈음의 코딩 스타일 가이드에는 들여쓰기를 몇 칸 해야 하는지까지도 정하고 있으며, 편집기들도 탭 문자를 입력하면 적절한 칸수만큼 빈칸 문자로 채워주는 기능을 제공하고 있다.

옛날에는 탭 하나가 8칸을 차지하는 경우가 많았기 때문에 들여쓰기도 탭 하나 폭, 또는 8칸이었지만 요즘은 코드의 들여쓰기 단계도 늘어나는 편이고, 8칸은 공간 낭비가 많아서 요즘은 2칸이나 4칸을 많이 채택하고 있다.


2. 적용


위의 표기법을 통해 변수와 메서드, 클래스의 이름을 다시 정의하고, 한 번에 알 수 있게 수정하게 되었다. 예를 들면 index라는 변수는 한 눈에 index를 알아차리기 힘들어서, gridIndex라고 변수명을 구체적으로 바꾸게 되었다.


2.1 변수 및 게임 오브젝트


변수명과 오브젝트 명은 카멜 표기법을 따라 작성하게 되었다. 변수들은 스크립트 내에서 한눈에 알아볼 정도의 수준으로 변경하였다. for문 안에 있는 i,j와 같은 변수와 flag와 같이 알 수 없는 변수는 모두 변경하여 주었다.

    public int gridIndex;
    string[,] gridArray;
    List<List<string>> word3 = new List<List<string>>();
    List<List<string>> word4 = new List<List<string>>();
    int funcCnt;
    int stageNum;
    bool done = false;
    int startTime;
    bool funcflag=true;
    string stringSave;
    public int hint;
    [SerializeField] int emptycnt=50;
    List<string> empty = new List<string>();


위의 예시는 StageManager에 있는 변수들로 어느정도 알아볼 수 있게 변경하였다. 추가적으로 for문과 같은 i,j 같은 변수는 아래와 같이 변경하였다.


for (int positionX = 0; positionX < wordInfo.len; positionX++)
            {
                if (wordInfo.x == 0)
                {
                    empty[positionX, 0] = 0;
                    for (int tempIndex = wordInfo.x + 1; tempIndex < gridIndex; tempIndex++)
                    {
                        if (gridArray[wordInfo.x + 1, wordInfo.y + positionX] == "1")
                        {
                            empty[positionX, 1] = 0;
                            break;
                        }
                        else if (tempIndex == gridIndex - 1 && gridArray[tempIndex, wordInfo.y + positionX] == "0")
                        {
                            empty[positionX, 1] = gridIndex - 1;
                            break;
                        }
                        else if (gridArray[tempIndex, wordInfo.y + positionX] == "-1")
                        // 생략


게임 오브젝트도 같은 방법으로 정리하였으며, 게임 오브젝트는 하이라이키에 있는 부분과 이름을 맞추어 생성하였고, 유니티 하이라이키 부분의 네이밍도 다시하게 되었다. 수정을 하면서 알아보기 편하게 Panel~, Button~ 같이 종류를 앞 부분에 작성하고 뒷 부분에는 용도를 작성하였다.

    [SerializeField] public GameObject panelMain;
    [SerializeField] public GameObject panelSub;
    [SerializeField] public Text textStage;
    [SerializeField] public GameObject tilePrefab;
    public GameObject[,] tilesMain;
    List<GameObject> tilesSub = new List<GameObject>();
    [SerializeField] GameObject panelClearStage;
    [SerializeField] GameObject panelLoading;
    [SerializeField] GameObject panelAchievement;
    [SerializeField] public Text hintText;
    [SerializeField] public GameObject Hint;
    [SerializeField] public Sprite[] spritesTileNull;
    [SerializeField] public Sprite[] spritesTileEmpty;
    [SerializeField] public Sprite[] spritesTileExist;
    [SerializeField] public Sprite[] hitTile;



위와 같이 빈 오브젝트를 통해 오브젝트 간의 그룹화를 진행하고 오브젝트 이름도 한 눈에 알아볼 수 있게 수정하였다.


2.2 메서드 이름 수정


메서드 이름은 파스칼 표기법으로 통일하였다. 이름은 주로 Set~, Get~, Change~, Update, Start~~ 등으로 동사을 앞 부분에 작성하고 뒷 부분에는 목적어를 서술하는 방식이다. 아래는 BackEndManager 스크립트의 일부이다.


public void CheckPlatformVersion()
public bool CheckVersion()
public void OpenStore()
private string GetTokens()
public void OneClickGPGSLogin()


위와 같이 주로 동사를 앞쪽에 두고 뒤쪽에는 주로 목적어를 서술하게 되었다. 전체적으로 길이를 타협하여 한 눈에 알아볼 정도의 길이와 뜻을 함축하려고 노력하였다.

3.region and partial


먼저 위의 두개는 나는 코드를 알아보기 수월하게 만들기 위해 사용하였다. region을 이용하여 먼저 크게 변수, 게임 오브젝트, 메서드, 클래스를 나누고 메서드를 용도에 따라 나누게 되었다. 이 부분에서 양이 많아진다 생각하면, partial로 스크립트를 용도에 따라 나누었다. 예를 들면, BackEndManager 스크립트를 두개로 나누었는데, 먼저 BackEndManager에는 주로 서버에서 유저의 정보를 불러오는 부분을 작성하고, partial로 나눈 BackEndLogin에는 로그인에 관련된 메서드를 작성하게 되었다.

#region Variable
    public string customId;
#endregion
#region GameObject
    [SerializeField] public InputField inputFieldNickname;
    [SerializeField] public Text textMyRanking;
    [SerializeField] public Text textMyNickname;
    [SerializeField] public Text textMyStage;
    [SerializeField] public GameObject prefebRanker;
    [SerializeField] public GameObject panelRanking;
    [SerializeField] public GameObject contentRank;
    [SerializeField] public GameObject panelNetworkError;
    [SerializeField] public GameObject panelWarning;
    [SerializeField] public GameObject panelChooseLogin;
    [SerializeField] public GameObject panelChooseNickname;
    [SerializeField] public GameObject alarmCustomToGoogle;
    [SerializeField] public GameObject alarmGPGSFail;
    [SerializeField] public Button buttonCustomToGoogle;
    [SerializeField] public GameObject alarmLowVersion;
    [SerializeField] public Text textVersion;
    [SerializeField] public GameObject iconMyRanking;
#endregion  

public partial class BackEndManager : MonoBehaviour
public partial class BackEndManager : MonoBehaviour


위와 같은 방식으로 작성하였다. StageManager의 경우에는 메서드의 용도가 정확하여 용도 별로 메서드를 나누게 되었다.