C#

[C#] 네이밍 룰

코북 2023. 3. 28. 13:40

 기본적으로 모든 C# 변수의 이름은 대소문자를 구별한다는 것을 알아야 한다. 하기의 규칙은 관례적으로 주로 사용하는 표준이지만 회사 혹은 팀마다 다른 방식으로 사용할 수 있다. 모듈 단위 및 팀 단위 개발을 진행할 때 가장 기초적이고 중요한 요소가 네이밍 룰이다.

 

1. 헝가리안 표기법 (Hungarian Case)

 변수의 자료형을 변수명의 접두사로 붙이는 방식. 멤버 변수에는 m_을 접두사로 사용한다. 그러나 닷넷 코딩 표준에서 헝가리안 표기법은 추천하지 않는다. 모든 변수에는 카멜 표기법을 사용하고, 데이터 타입보다 변수가 담는 내용을 표현하는 것이 중요하다.

int intNum;
string strName;
int m_Age;

 

2. 카멜 표기법 (Camel Case)

 단어와 단어 사이를 대문자로 구분하는 표기법. 단, 첫 글자는 소문자로 한다. 변수함수 파라미터에는 카멜 표기법을 사용한다. 그러나 public 상수(public const)public 읽기 전용 정적 변수(public static readonly)파스칼 케이스를 사용한다.

int totalCount = 10000;

void GetTax(int totalPrice)
{
   int totalTax = totalCount * totalPrice;
}

public void Tax{
   public const int TaxRate = 5;
   public static readonly Tag;
}

 

3. 파스칼 표기법 (Pascal Case)

 모든 단어의 첫 글자만 대문자로 나타내고 나머지는 소문자로 나타낸다. 함수(메서드) 명클래스 명, 속성 명, 이벤트 명에는 파스칼 표기법을 사용한다. 인터페이스접두사 "I"가 포함된 파스칼 표기법을 따른다. Enum Value 즉, Enum element파스칼 케이스를 사용한다.

public class MemoryCache : ICacheInter {
    public int OrderNum {get; set;} 
    // public 멤버는 외부에서 접근해서 사용하기 때문에 대문자로 시작하는 관례를 따른다.
    
    public MemoryCache() 
    {
    }
    
    public T AddCache<T>(int minute) where T : class 
    {
    }
    
    public void Clear()
    {
    }
    
    public event EventHendler Completed;
    
}

public interface ICacheInter
{
    T AddCache(int minute) where T : class;
    void Clear();    
}

public enum OrderStatus
{
    Open,
    InDelivery,
    CancelByCustomer
}

 

4. 스네이크 표기법(Snake Case)

 단어 사이에 _를 이용해서 구분하는 방법. C#에서 사용하지 않는다.

int number_of_max;
string name_book;

 

5. 스크리밍 스네이크 표기법 (Screaming Snake Case)

 스네이크 표기법에서 모두 대문자로 한다. C#에서 권장되진 않지만, 상수에 쓰는 경우도 있다.

const int START_INDEX = 1;

 

  • i, n, s 같이 한 글자로 된 이름을 사용하지 말 것. index, temp 같은 이름을 사용할 것. 한 가지 예외가 있다면 루프에서 반복을 의미하는 변수를 사용하는 경우. 
for(int i = 0; i < cnt; i++) {
    // ...
}

 

  • 지역 변수에는 언더 바(_)를 사용하지 않는다. 일반적으로 언더 바(_)는 다른 지역변수들과 구분을 위해 전역 변수, 멤버 변수에 주로 사용된다.
public int m_minute;
public int _mMinute;

 

  • 키워드와 비슷한 이름을 사용하지 않는다. 프레임워크 내부에서 지원되는 키워드를 비슷하게 사용하면 혼란이 올 수 있다. using, public, class, static, void, Main, interface 등과 같은 키워드는 사용하지 않는다. 키워드 앞에 '@' 기호를 붙이면 키워드도 변수로 사용할 수는 있지만 권장하지 않는다.

 

  • boolean이 들어가는 변수, 속성, 함수(method) 등은 "is" 또는 유사한 접두사(has, can)를 사용한다.
  • 변수의 이름은 누구나 봐도 바로 이해할 수 있는 것이 좋다. ex) isDelete, 삭제 여부
public bool isTrue = true;
private bool IsDelete() 
{
    //...
    retrun true;
}

 

  • 네임스페이스 명은 표준 패턴을 따른다. 그러나 회사 내의 그룹 이름은 수명이 짧은 경향이 있으므로 조직 계층을 네임스페이스 계층 구조의 이름에 대한 기준으로 사용하지 않는다.
예) <회사명>.<제품명>.<최상위모듈>.<하위모듈>
예) apple.iphone.xcode.loginApi

 

  • 파일명클래스 명과 같아야 하며, 파스칼 표기법을 사용한다. 예를 들어 클래스 명이 'CoBook'이라면 파일명은 'CoBook.cs'이어야 한다.
coBook.cs // 좋지 않은 예
CoBook.cs // 좋은 예

 

  • Generic 클래스의 Generic 파라미터 타입은 가능하면 T와 같이 한 문자를 선택한다. (복수 타입 파라미터가 필요하면 예외)
public class MyList<TValue> //나쁜표현
public class MyList<T> //좋은표현

 

  • 클래스 명, enum 명, delegate 명에는 어떤 접두사도 붙이지 않는다.
public enum EOrderType //나쁜 표현

 

  • 클래스 명, 메서드 명, 속성 명 등의 명칭에 축약된 단어를 사용하지 않는다.
  • 꼭 필요하거나 널리 알려진 용어는 축약형을 사용할 수 있다. 예를 들어, UserInterface를 UI로 축약하거나 Online Analytical Processing을 Olap으로 축약할 수 있다. 축약형을 사용할 경우에는 2자까지는 모두 대문자로, 2자 초과인 경우는 Pascal Casing이나 Camel Casing을 사용한다.
public int GetWindow() //좋은 표현
public int GetWin() //나쁜 표현

// UserInterface => UI
// Online Analytical Processing => Olap

HTMLButton //나쁜 표현
HtmlButton //좋은 표현

System.Io //나쁜 표현
System.IO //좋은 표현

 

  • 메서드는 행위를 나타내므로 동사(verb)를 사용한다.
public int Addition(int a, int b) //나쁜 표현
public int Add(int a, int b) //좋은 표현

 

  • 필드나 속성 혹은 지역 변수는 명사(noun)를 사용한다.
private bool createTable  //나쁜 표현
private bool newTable  //좋은 표현

 

  • 이벤트는 가능하면 동사형으로 표현한다.
public event EventHandler Completion //나쁜 표현
public event EventHandler Completed  //좋은 표현

 

  • 지역 변수는 가능하면 의미있는 단어를 사용한다. 
int i, j //나쁜 표현
int startIndex, endIndex  //좋은 표현