닷넷의 일반적인 코딩 규칙과 스타일

닷넷의 일반적인 코딩 규칙과 스타일

닷넷에서의 코딩 규칙과 스타일 가이드는 코드의 일관성, 가독성, 유지보수성을 높이는 데 중요한 역할을 합니다. 이러한 규칙과 가이드는 개발자가 코드를 쉽게 이해하고 유지보수할 수 있도록 하며, 특히 팀 프로젝트에서 일관된 규칙을 적용하여 코드 품질을 높이는 것이 가능합니다. 아래는 닷넷 프로젝트에서 권장되는 일반적인 코딩 규칙과 스타일 가이드입니다.

용어 설명

PascalCase

  • 각 단어의 첫 글자를 대문자로 쓰는 표기법입니다.
  • UpperCamelCase 라고도 합니다.
  • 일반적으로 클래스, 메서드, 속성 등의 이름에 사용됩니다.
  • 예: MyVariable, MyMethod, EmployeeManager.

camelCase

  • 첫 단어의 첫 글자는 소문자로, 이후 단어의 첫 글자는 대문자로 쓰는 표기법입니다.
  • LowerCamelCase 라고도 합니다.
  • 주로 변수명과 매개변수명에 사용됩니다.
  • 예: myVariable, myMethod.

snake_case

  • 모든 글자를 소문자로 작성하며, 단어와 단어 사이에 밑줄(_)을 사용하는 표기법입니다.
  • 주로 데이터베이스 필드명이나 특정 설정 파일에서 사용됩니다.
  • 예: my_variable, user_id.

K&R 스타일

  • 중괄호 { }를 제어 구조의 같은 줄에 배치하는 코딩 스타일입니다.
  • Kernighan and Ritchie 스타일이라고도 합니다.
if (condition) {
    // code block
}

Allman 스타일

  • 중괄호 { }를 항상 새로운 줄에 배치하는 코딩 스타일입니다.
  • 이 방식은 코드의 가독성을 높이는 데 유용합니다.
if (condition)
{
    // code block
}

네이밍 규칙

클래스 및 메서드 이름

클래스와 메서드 이름은 PascalCase로 작성하며, 각 단어의 첫 글자는 대문자로 시작합니다. 클래스 이름은 해당 클래스의 역할을 명확하게 나타내야 하며, 메서드 이름은 동사 또는 동사구로 작성하여 기능을 설명해야 합니다.

public class OrderProcessor
{
    public void ProcessOrder()
    {
        // 코드
    }
}

인터페이스 이름

인터페이스 이름은 I 접두사를 붙이고 PascalCase로 작성합니다.

public interface IOrderService
{
    void ProcessOrder();
}

매개변수 이름

매개변수 이름은 camelCase로 작성하며, 의미 있는 이름을 사용하여 가독성을 높여야 합니다.

public void SubmitOrder(int orderId, string customerName)
{
    // 코드
}

변수 및 필드 이름

로컬 변수와 필드는 camelCase로 작성하며, 첫 글자는 소문자로 시작합니다. 변수와 필드의 목적을 명확히 드러내기 위해 의미 있는 이름을 사용해야 합니다.

int customerCount;
string customerName;

컬렉션 및 배열 이름

  • 컬렉션 및 배열 변수명은 복수형으로 작성하는 것이 일반적입니다. 이를 통해 단일 값과 여러 값을 명확하게 구분할 수 있습니다.
  • 예: orderList, customerArray.
List<Order> orderList = new List<Order>();
int[] customerIds = new int[10];

상수 및 정적 읽기 전용 필드 이름

상수는 모두 대문자로 작성하며, 단어 사이에 밑줄을 사용해 구분합니다. 정적 읽기 전용 필드는 PascalCase를 사용합니다.

const int MAX_CONNECTIONS = 100;
private static readonly int DefaultTimeout = 60;

비동기 메서드 이름

  • 비동기 메서드의 이름은 반드시 Async 접미사를 사용하여 비동기 작업임을 명시해야 합니다. 이는 호출자가 해당 메서드가 비동기적으로 동작함을 알 수 있도록 돕습니다.
  • 예: FetchDataAsync, SaveChangesAsync.
public async Task FetchDataAsync()
{
    // 비동기 작업 코드
}

Lambda 표현식 및 LINQ 구문

  • Lambda 표현식이나 LINQ 구문을 사용할 때는 코드의 가독성을 높이기 위해 적절한 줄바꿈과 들여쓰기를 사용합니다. 특히, 복잡한 쿼리 구문은 가독성에 중점을 두어 작성해야 합니다.
var orders = orderList
    .Where(order => order.Status == "Pending")
    .OrderBy(order => order.OrderDate)
    .ToList();

중괄호 및 들여쓰기

중괄호 스타일

중괄호는 항상 새 줄에서 시작하며, 가독성을 높이기 위해 K&R 스타일 대신 Allman 스타일을 권장합니다.

if (isActive)
{
    StartProcess();
}
else
{
    StopProcess();
}

들여쓰기

들여쓰기는 공백 4칸을 사용하며, 모든 코드 블록의 들여쓰기를 일관되게 유지합니다.

public void ProcessOrder()
{
    if (orderIsValid)
    {
        SubmitOrder();
    }
    else
    {
        CancelOrder();
    }
}

공백 및 줄바꿈

공백 처리

연산자, 쉼표, 조건식에서 적절한 공백을 사용해 가독성을 높여야 합니다. 함수나 메서드 호출 시 괄호 안에는 공백을 사용하지 않습니다.

int result = a + b;
if (value == 10)
{
    ProcessData();
}

줄바꿈

코드가 너무 길어질 경우 적절히 줄바꿈을 사용해 가독성을 유지합니다. 메서드 간 또는 큰 논리적 단위 간에는 한 줄의 빈 줄을 사용하여 구분을 명확히 해야 합니다.

var result = Calculate(a, b, 
                       c, d);

주석

XML 주석

클래스, 메서드, 속성 등에 대해 XML 주석을 사용하여 문서를 자동 생성할 수 있도록 합니다. 주석은 코드의 동작과 의도를 명확하게 설명해야 합니다.

/// <summary>
/// 두 숫자의 합을 계산합니다.
/// </summary>
/// <param name="x">첫 번째 숫자</param>
/// <param name="y">두 번째 숫자</param>
/// <returns>두 숫자의 합</returns>
public int Add(int x, int y)
{
    return x + y;
}

코드 주석

복잡한 논리나 중요한 코드를 설명하기 위해 필요한 경우 주석을 추가합니다. 그러나 주석 없이도 코드 자체가 명확하도록 작성하는 것이 중요합니다.

// 주문 데이터를 데이터베이스에 저장합니다.
SaveOrder(order);

TODO 주석

  • 코드가 완료되지 않았거나 추후 수정이 필요할 때, TODO 주석을 사용하여 해당 부분을 명시합니다. 이를 통해 협업 시 중요한 수정 사항을 쉽게 파악할 수 있습니다.
  • 비주얼스튜디오를 비롯한 대부분의 IDE 는 TODO 주석을 특별하게 인식하여 이를 기반으로 자동 리스트를 생성해 줍니다. 개발자는 이 리스트를 통해 남아 있는 작업을 한눈에 확인할 수 있고, 필요한 작업을 빠르게 찾아갈 수 있습니다.
// TODO: 이메일 발송 기능 추가 필요
SendOrderConfirmation(order);

제어 구문

if-else 구문

if-else 구문에서는 항상 중괄호를 사용하며, 단일 구문일지라도 중괄호를 생략하지 않는 것이 좋습니다.

if (isValid)
{
    ApproveOrder();
}
else
{
    RejectOrder();
}

switch 구문

switch 구문에서는 각 case에 break를 포함하며, default 구문을 항상 추가해야 합니다.

switch (status)
{
    case Status.Pending:
        StartProcessing();
        break;
    case Status.Complete:
        FinalizeOrder();
        break;
    default:
        HandleError();
        break;
}

예외 처리

예외 처리

예외 처리는 가능한 구체적으로 작성하며, 반드시 필요한 경우에만 예외를 처리합니다. try-catch 블록에서 구체적인 예외 유형을 명시하고, 적절한 로그 메시지를 기록해야 합니다.

try
{
    ExecuteTransaction();
}
catch (InvalidOperationException ex)
{
    LogError(ex);
}

결론

닷넷 코딩 규칙과 스타일 가이드는 코드의 일관성을 유지하고, 가독성과 유지보수성을 높이는 데 중요한 역할을 합니다. 이러한 규칙을 따르면 팀 프로젝트에서 코드 품질이 향상되며, 장기적으로 유지보수가 용이한 코드를 작성할 수 있습니다. 이러한 규칙을 표준화하여 모든 개발자가 일관된 스타일로 코드를 작성하도록 하는 것이 매우 중요합니다.