본문 바로가기
프로그래밍 언어/C#

C# 네이밍

by Jinger 2023. 6. 12.

서론

    C# 코딩 컨벤션(C# coding Conventions)은 C# 코드를 작성할 때 사용되는 규칙과 가이드라인의 모음이다. 이러한 컨벤션은 코드의 가독성과 일관성을 유지하고 협업 시에도 작성자 간에 일관된 스타일을 유지하기 위해 사용된다. 일반적으로 Microsoft에서 제공하는 C# 코딩 컨벤션을 따르는 것이 일반적이지만, 팀 또는 프로젝트에서 독자적인 컨벤션을 사용하기도 한다.


변수 이름 짓기의 종류

    변수 이름을 짓는 방법은 다양하나 대표적으로 아래와 같은 표기법이 존재한다. 여기서 C#은 주로 카멜 표기법과 파스칼 표기법을 사용한다.

카멜 표기법(Camel Case)
     각 단어의 첫 글자를 대문자로 표기하되 첫 단어의 첫 글자는 소문자로 표기하는 방식이다.  Java, C#, JS에서 많이 사용된다.
ex) camelCase, southKorea, numberOfProjectiles,...
스네이크 표기법(Snake Case)
     모두 소문자(혹은 모두 대문자)로 쓰되, 띄어쓰기를 밑줄(_) 기호로 대체하는 방식이다. C, C++에서 많이 사용된다. 변수나 함수, 유형, 클래스 이름은 소문자를, 상수 및 매크로 이름은 대문자를 사용하는 게 관례.
ex) snake_case, united_states_of_america, input_key,...
파스칼 표기법(Pascal Case)
    각 단어의 첫 글자를 대문자로 표기한다. 요즈음은 그냥 이것도 카멜 표기법이라고 부른다. 변수나 함수 이름으로는 카멜백 표기법을 사용하는 언어라고 해도 적어도 클래스 이름은 파스칼 표기법을 사용하는 게 보통이다.
ex) PascalCase, NationalBasketballAssociation, TotalCalculator,...
헝가리안 표기법(Hungarian Notation)
     첫 단어를 포함해서 모든 단어의 첫 글자를 대문자로 하되, 그 앞에 변수의 유형을 뜻하는 약어를 소문자로 붙여 준다.  주로 C에서 사용된다.
ex) iCount, strName,...
케밥 표기법(Kebab Case)
    모두 소문자(혹은 모두 대문자)로 쓰되, 띄어쓰기를 하이픈(-) 기호로 대체하는 방식이다. CSS, HTML, URL와 같이 "-"를 연산자로 이용하지 않는 언어에서 사용된다.
ex) kebab-casa, bayerische-motoren-werke, font-size,...

파스칼 케이스(PascalCase)

    class, record, sturct, namespace는 파스칼 표기법을 따른다. record의 프로퍼티는 public이므로 파스칼 케이스로 작성된다.

public class DataService
{
}
public record PhysicalAddress(
    string Street,
    string City,
    string StateOrProvince,
    string ZipCode);
public struct ValueCoordinate
{
}

    interface 또한 파스칼 케이스로 작성하되 이름 앞에 "I"를 붙이고, 열거형(enum)을 선언할 때는 앞에 "E"를 붙인다. enum의 요소 또한 파스칼 형식을 따른다.

public interface IWorkerQueue
{
}
public enum EDirection
{
    North,
    South
}

    public 필드, 속성, 이벤트, 메서드 및 로컬 함수는 파스칼케이스를 사용한다.

public class ExampleEvents
{
    // A public field, these should be used sparingly
    public bool IsValid;

    // An init-only property
    public IWorkerQueue WorkerQueue { get; init; }

    // An event
    public event Action EventProcessing;

    // Method
    public void StartEventProcessing()
    {
        // Local function
        static int CountQueueItems() => WorkerQueue.Count;
        // ...
    }
}

카멜 케이스(camelCase)

    private 혹은 internal와 같은 액세스 한정자는 카멜 표기법을 따르고, 프로퍼티의 경우 이름 앞에 "_"을 붙인다.

public class DataService
{
    private IWorkerQueue _workerQueue;
}

    static 필드로 작업할 때 스레드 정적 사용을 위해 접두사를 사용한다.

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

    메소드 매개변수를 작성할 때 카멜 표기법을 따른다.

public T SomeMethod<T>(int someNumber, bool isValid)
{
}

스네이크 케이스(SNAKE_CASE)

    const를 사용하는 경우 대문자 스네이크 표기법(UPPER_SNAKE_CASE)을 따른다.

const int SOME_CONSTANT = 1;


괄호

    C#에서 사용하는 괄호는 총 4가지로 "()" 소괄호(Round Brackets || Parentheses),  "[]" 대괄호(Square Brackets || Brackets), "{}" 중괄호(Curly Brackets || Braces), "<>" 홑화살괄호(Angle Brackets || Chevrons)가 있다.

들여쓰기(괄호) 스타일

    위 괄호 중 특히, 중괄호는 사이에 문장이 입력되기 때문에 간격이 많이 벌어지게 된다. 그래서 이에 따른 많은 코딩 스타일이 존재한다.

중괄호 배치 스타일 이름 설명
while (x == y)
{
    start();
    middle();

    end();
}
Allman 조건 다음 줄에 {로 시작해서 마지막 코드 다음 줄에 }로 마무리
while (x == y) {
    start();
    middle();

    end();
}
K&R 조건 옆에 {로 시작해서 마지막 코드 다음 줄에 }로 마무리
while (x == y)
  {
    start();
    middle();

    end();
  }
GNU Allman과 유사한 스타일이지만, 중괄호 앞에는 2칸, 실행문에는 4칸 들여쓰기 한다.
while (x == y)
    {
    start();
    middle();

    end();
    }
Whitesmith GNU와 유사하지만 중괄호와 실행문 모두 4칸 들여쓴다.
while (x == y)
{   start();
    middle();
    end();

}
Horstmann Allman과 유사한 스타일이지만, 첫 시작 함수를 {로 줄에 시작한다.
while (x == y)
{   start();
    middle();
    end(); }
Pico Allman과 유사한 스타일이지만, 첫 시작 함수는 {로 줄에 시작하고 마지막 함수 뒤에 }를 붙인다.
while (x == y) {
    start();
    middle();

    end();
    }
Ratliff K&R과 유사하지만, 마지막 }앞에 4칸 들여쓰기 한다.
while (x == y)
  { start();
    middle();
    end(); }
Lisp Pico와 유사하지만, {}사이의 공백을 최소화한다.
#define W(c,b) {while(c){b}}
W(x==y,s();se();)
APL 한줄에 최대한 줄여쓴다.

레이아웃

    좋은 레이아웃은 서식을 사용하여 코드 구조를 강조하고 코드를 읽기 쉽게 만든다. Microsoft 예제 및 샘플은 다음 규칙을 따른다.

  • 한 줄에 하나의 문장만 작성할 것.
  • 한 줄에 하나의 선언만 작성할 것.
  • 연속 줄이 자동으로 들여쓰기되지 않으면 한 탭 간격(공백 4개)을 들여쓸 것.
  • 메서드 정의와 프로퍼티 정의 사이에 하나 이상의 빈 줄을 추가할 것.
  • 중괄호("{}")는 다음 줄에 사용하여 표현식의 절을 명확하게 할 것.
  • 클래스 안에서 멤버 변수와 메서드의 등장 순서는 다음을 따른다.
  1. public 멤버변수/프로퍼티
  2. internal 멤버변수/프로퍼티
  3. protected 멤버변수/프로퍼티
  4. private 멤버변수
  5. 생성자
  6. public 메서드
  7. Internal 메서드
  8. protected 메서드
  9. private 메서드

주석 규칙

    주석은 코드의 이해를 돕기 위해 사용되어야 합니다. "//"를 사용하여 한 줄 주석을 작성할 수 있으며, "/* */"를 사용하여 여러 줄 주석을 작성할 수 있다.

  • 코드 줄의 끝이 아니라 별도의 줄에 주석을 배치한다.
  • 주석 텍스트를 대문자로 시작한다.
  • 마침표로 주석 텍스트를 종료한다.
  • 다음 예제와 같이 주석 구분 기호(//)와 주석 텍스트 사이에 하나의 공백을 삽입한다.
// The following declaration creates a query. It does not run
// the query.
  • 주석 주위에 형식이 지정된 별표 블록을 만들지 않는다.
  • 모든 공용 구성원이 해당 동작에 대한 적절한 설명을 제공하는 필수 XML 주석을 가지고 있는지 확인한다.

언어 지침

    클래스, 인터페이스, 생성자의 이름명사로 작성되어야 한다. 메서드의 이름동사 또는 동사구(동사(명령형)+명사(목적어))로 작성되어야 한다. 단, 단순히 부울(boolean) 상태를 반환하는 메서드의 동사 부분은 최대한 Is, Can, Has, Should를 사용하되 그러는 것이 부자연스러울 경우에는 상태를 나타내는 다른 3인칭 단수형 동사를 사용한다. 변수의 이름의미를 전달하도록 작성되어야 한다.

public bool IsAlive(Person person);
public bool HasChild(Person person);
public bool CanAccept(Person person);
public bool ShouldDelete(Person person);
public bool Exists(Person person);
  • 짧은 문자열을 연결할 때에는 문자열 보간을 사용한다.

부울 변수 앞에 "b"가 아닌 "is"를 붙이자. private도 마찬가지이다.

필드 및 변수(fild & variable)

변수 및 필드에 대해 다음 규칙을 고려하십시오.

  • 변수 이름에 명사 사용: 변수 이름은 사물이나 상태를 나타내기 때문에 설명적이고 명확하며 모호하지 않아야 한다. 따라서 변수가 bool 유형인 경우를 제외하고는 이름을 지정할 때 명사를 사용하자(아래 참고).
  • 동사가 있는 접두사 부울: 변수가 참 또는 거짓 값을 나타낼 때, 종종 변수의 이름은 다음과 같은 질문 형식의 역할을 수행한다. e.g. 플레이어가 실행 중입니까? 게임이 끝났습니까? 그렇기에 의미를 더 명확하게 하기 위해 동사 앞에 접두사를 붙인다. 종종 isDead, isWalking, hasDamageMultiplier 등과 같은 설명이나 조건과 쌍을 이룬다.
  •  의미 있는 이름을 사용하자. 축약하지 말자(수학이 아닌 경우): 변수 이름을 보면 의도가 드러난다. 발음하기 쉽고 검색하기 쉬운 이름을 선택하자.
  • 단일 문자 변수는 루프 및 수학 표현식에 적합하지만 그 외에는 축약하지 말라. 명확성은 몇 개의 모음을 생략하는 시간을 절약하는 것보다 더 중요하다.
  • 빠른 프로토타이핑을 수행할 때 짧은 "정크" 이름을 사용한 다음 나중에 의미 있는 이름으로 리팩터링할 수 있다.
Examples to avoid Use instead  Notes
int d int elapsedTimeInDays 카운터 또는 표현식이 아닌 한 문자 약어를 사용하지 마십시오.
int hp
string tName
int mvmtSpeed
int healthPoints
string teamName
int movementSpeed
변수 이름은 의도를 나타냅니다. 검색 및 발음이 가능한 이름 만들기
int getMovemementSpeed int movementSpeed 명사를 사용하십시오. 부울(아래)이 아닌 한 메소드에 대한 동사를 예약하십시오.
bool dead bool isDead bool isPlayerDead 부울은 참 또는 거짓으로 대답할 수 있는 질문을 합니다.
  • 공용 필드(public)에는 파스칼 케이스를 사용하라. 비공개 변수(private)에 카멜 케이스 사용하라.: 공개 필드 대신 공개 getter가 있는 속성을 사용하자.
  • 너무 많은 접두사 또는 특수 인코딩을 피하라. 개인 멤버 변수에 밑줄(_)을 접두사로 붙여 지역 변수와 구별할 수 있다. 또는 this 키워드를 사용하여 컨텍스트에서 멤버 변수와 지역 변수를 구분하고 접두사를 건너뛴다. 공용 필드 및 속성에는 일반적으로 접두사가 없다. 일부 스타일 가이드는 개인 멤버 변수(m_), 상수(k_) 또는 정적 변수(s_)에 접두사를 사용하므로 이름을 통해 변수에 대한 자세한 내용을 한 눈에 파악할 수 있다. 많은 개발자들이 이를 피하고 대신 편집기에 의존한다. 그러나 모든 IDE가 강조 표시 및 색상 코딩을 지원하는 것은 아니며 일부 도구는 풍부한 컨텍스트를 전혀 표시할 수 없다. 접두사를 팀으로 함께 적용할 방법(또는 적용할지 여부)을 결정할 때 이를 고려하라.
  • 액세스 수준 한정자를 일관되게 지정(또는 생략): 액세스 한정자를 생략하면 컴파일러는 액세스 수준을 비공개로 가정하자. 이것은 잘 작동하지만 기본 액세스 수정자를 생략하는 방법에 일관성을 유지해야 한다. 나중에 하위 클래스에서 이것을 원한다면 protected를 사용해야 한다는 것을 기억하라.
  • 한 줄에 하나의 변수 선언 사용: 덜 간결하지만 가독성이 향상된다.
  • 중복 이름 방지: 클래스가 Player인 경우 PlayerScore 또는 PlayerTarget이라는 멤버 변수를 생성할 필요가 없다. 점수 또는 대상으로 트리밍한다.
  • 농담이나 말장난을 피하십시오: 지금은 웃음을 자아낼 수 있지만, InfiniteMonkeys 또는 dudeWheresMyChar 변수는 수십 번 읽은 후에는 유지되지 않는다.
  • 가독성에 도움이 되고 유형이 명확한 경우 암시적으로 유형이 지정된 지역 변수에 var 키워드를 사용하라. 스타일 가이드에서 var를 사용할 시기를 지정하자. 예를 들어 많은 개발자는 var가 변수의 유형을 가리거나 루프 외부의 기본 유형을 사용하는 경우 이를 피한다. 일반적으로 코드를 읽기 쉽게 만들고(예: 긴 유형 이름 포함) 유형이 모호하지 않은 경우 var를 사용한다.

열거형(Enums)

    열거형은 명명된 상수 집합으로 정의된 특수 값 유형이다. 기본적으로 상수는 0부터 세는 정수이다. 열거형 이름과 값에는 파스칼 케이스를 사용하라. 공용 열거형을 클래스 외부에 배치하여 전역으로 만들 수 있습니다. 열거형 이름에 단수 명사를 사용한다.

클래스 및 인터페이스(Classes and interfaces)

    클래스와 인터페이스의 이름을 지정할 때 다음 표준 규칙을 따른다.

  • 클래스 이름에 파스칼 대소문자를 사용하라.
  • 파일에 Monobehaviour가 있는 경우 소스 파일 이름이 일치해야 한다. 파일에 다른 내부 클래스가 있을 수 있지만 파일당 하나의 Monobehaviour만 존재해야 한다.
  • 대문자 I를 인터페이스의 접두사로 사용하라: 기능을 설명하는 형용사를 뒤에 붙인다.

메서드(Methods)

    메서드는 작업을 수행하므로 다음 규칙을 적용하여 적절하게 이름을 지정합니다.

  • 이름을 동사로 시작: 필요한 경우 컨텍스트를 추가한다. 예: GetDirection, FindTarget 등
  • 매개변수에 카멜 케이스 사용: 메서드에 전달된 매개변수를 지역 변수처럼 형식화한다.
  • bool을 반환하는 메서드는 질문을 해야 한다. 부울 변수 자체와 마찬가지로 true와 false 조건을 반환하는 경우 메소드에 동사를 접두사로 붙인다.

Events and event handlers

    C#의 이벤트는 관찰자 패턴을 구현한다. 이 소프트웨어 설계 패턴은 주체(또는 게시자)라는 하나의 개체가 관찰자(또는 구독자)라는 종속 개체 목록을 알릴 수 있는 관계를 정의한다. 따라서 주제는 관련 개체를 긴밀하게 결합하지 않고도 관찰자에게 상태 변경을 브로드캐스트할 수 있다. 주체 및 관찰자에서 이벤트 및 관련 메서드에 대해 여러 이름 지정 체계가 존재한다.

  • 동사구를 사용하여 이벤트 이름 지정: 상태 변경을 정확하게 전달하는 이름을 선택한다. 현재 또는 과거 분사를 사용하여 이벤트 "이전" 또는 "이후"를 나타낸다. 예를 들어, 문을 열기 전 이벤트에 대해 "OpeningDoor"를 지정하고 이후 이벤트에 대해 "DoorOpened"를 지정한다.
  • 이벤트에 System.Action 델리게이트 사용: 대부분의 경우 Action<T> 델리게이트는 게임 플레이에 필요한 이벤트를 처리할 수 있다. 반환 유형이 void인 다양한 유형의 0에서 16개 사이의 입력 매개변수를 전달할 수 있다. 미리 정의된 대리자를 사용하면 코드가 저장된다.
  • 이벤트 발생 방법(제목 내)에 "On" 접두사 추가: 이벤트를 발생시키는 주체는 일반적으로 "On" 접두사가 붙은 방법에서 이벤트를 발생시킨다. "OnOpeningDoor" 또는 "OnDoorOpened."
  • 이벤트 처리 메서드(옵저버에서) 앞에 주체의 이름과 밑줄(_)을 붙인다. 주체의 이름이 "GameEvents"인 경우 관찰자는 "GameEvents_OpeningDoor" 또는 "GameEvents_DoorOpened"라는 메서드를 가질 수 있다. 이것을 "이벤트 처리 방법"이라고 하며 EventHandler 대리자와 혼동하지 마십시오. 팀의 일관된 명명 체계를 결정하고 스타일 가이드에서 해당 규칙을 구현한다.
  • 필요한 경우에만 사용자 지정 EventArgs 만들기: 사용자 지정 데이터를 이벤트에 전달해야 하는 경우System.EventArgs 또는 사용자 지정 구조체에서 상속된 새로운 유형의 EventArgs를 만다.

Namespaces

    네임스페이스를 사용하여 클래스, 인터페이스, 열거형 및 s가 다른 네임스페이스 또는 전역 네임스페이스의 기존 항목과 충돌하지 않도록 한다. 네임스페이스는 또한 타사 자산과의 충돌을 방지할 수 있다. 네임스페이스를 적용할 때:

  • 특수 기호나 밑줄 없이 파스칼 대소문자를 사용한다.
  • 네임스페이스 접두어를 반복해서 입력하지 않도록 파일 맨 위에 using 지시문을 추가한다.
  • 하위 네임스페이스도 생성합니다. 점(.) 연산자를 사용하여 이름 수준을 구분하여 스크립트를 계층적 범주로 구성할 수 있다. 예를 들어 MyApplication.GameFlow, MyApplication.AI, MyApplication.UI 등을 생성하여 게임의 다양한 논리적 구성 요소를 보유할 수 있다.

C# 코드 스타일

    개발 팀에 맞는 방식으로 커스터마이징하는 것을 추천한다. 스타일을 고려할 경우 아래와 같은 컨벤션의 세부 사항 결정 시 고려해야한다.

  • 형식 지정 규칙
  • 가독성 개선
    • 공백을 추가하여 코드 밀도 감소
    • 함수 인수 사이의 쉼표 다음에 하나의 공백을 사용
    • 괄호와 함수 인수 뒤에는 공백을 추가하지 않는다.
    • 함수 이름과 괄호 사이에 공백을 사용하지 않는다.
    • 대괄호 안에 공백을 사용하지 않는다.
    • 흐름 제어 조건 앞에 하나의 공백 사용
    • 비교 연산자 앞뒤로 하나의 공백을 사용
  • 명명 규칙
    • 접두사 고려
  • 대소문자 사용
  • 모든 사항을 형식화하지 말아라
  • 명확한 가이드 제작
    • 인수를 적게 사용
    • 과도한 오버로딩을 지양
    • 부수 효과 방지

주섬주섬

    이러한 C# 코딩 컨벤션은 가이드일 뿐이며, 개발 팀이나 프로젝트에 따라 사용되는 컨벤션의 세부 사항은 달라질 수 있다. 따라서 팀의 일관성을 유지하고 가독성을 향상시키기 위해 팀원들과 함께 컨벤션을 합의하는 것이 좋다. "텍스트 편집기> [C# 또는 Visual Basic] >코드 스타일>일반"을 통해 Visual Studio의 코드 스타일을 지정 및 변경할 수 있다.

참고

 

Common C# Coding Conventions

Learn about commonly used coding conventions in C#. Coding conventions create a consistent look to the code and facilitate copying, changing, and maintaining the code.

learn.microsoft.com

 

코드 스타일 옵션 및 코드 정리 - Visual Studio (Windows)

코드 정리(Visual Studio 2019) 및 문서 서식(Visual Studio 2017) 명령을 사용하여 이러한 코드 스타일 기본 설정을 적용하도록 Visual Studio를 구성하는 방법을 알아봅니다.

learn.microsoft.com

 

C# 코드 스타일 가이드 만들기 | Unity Blog

카멜 표기법과 파스칼 표기법은 스네이크 표기법, 케밥 표기법, 헝가리언 표기법에 비해 일반적으로 사용되는 표준 표기법입니다. 유니티 가이드에서는 일반적인 Unity 사용 사례에 따라 public 필

blog.unity.com

 

Create a C# style guide: Write cleaner code that scales

Get tips from industry experts on how to create a C# code style guide. A style guide can help your team develop a codebase to support the growth of your project to a commercial-scale production.

resources.unity.com

 

반응형

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 3. 변수와 입력문  (1) 2023.10.04
C# 2. 출력문  (0) 2023.09.10
C# 1. C# 들어가기에 앞서  (0) 2023.09.07
C# 특징과 비교  (1) 2023.09.01
C# 전처리기 지시문  (0) 2023.07.05

댓글