숏컷 코드
// 파일 상단 — namespace 가져오기
using System.Collections.Generic;
using Json = System.Text.Json.JsonSerializer; // alias
// 파일 스코프 namespace (C# 10+)
namespace Game.Services;
public class ScoreService
{
public List<int> Scores { get; } = new();
}문법
어떤 using / namespace 형태를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 것 |
|---|---|
| 파일 상단 namespace 가져오기 | using directive |
| 자원 자동 해제 | using var, using (...) |
| 파일 전체를 한 namespace로 감싸기 | file-scoped namespace |
| 프로젝트 전체 공통 import | global using |
| 이름 충돌 해결 | alias using |
using directive — 두 가지 역할이 완전히 다르다
using 키워드는 C#에서 두 가지 전혀 다른 역할을 합니다. 혼동이 잦으므로 반드시 구분해야 합니다.
// ① using directive — 파일 상단, namespace 가져오기
using System.IO; // File, Path 등을 짧게 쓸 수 있게 함
// ② using statement — 자원 수명 관리 (IDisposable)
using var reader = new StreamReader("file.txt"); // 블록 끝에 자동 Disposeusing directive 는 긴 타입 이름의 전체 경로(System.Collections.Generic.List<T>)를 짧게 쓸 수 있게 해주는 이름 가져오기 문법입니다.
namespace — 이름 충돌을 막는 논리 경계
namespace 는 타입을 논리적으로 묶어 이름 충돌을 방지합니다. 같은 User 클래스라도 Game.Domain.User와 Admin.Domain.User는 다른 타입입니다.
// 전통 방식 — 블록 안에 코드 작성 (들여쓰기 1단계 추가)
namespace Game.Domain
{
public class User { }
}
// file-scoped namespace (C# 10+) — 파일 전체에 적용, 들여쓰기 없음
namespace Game.Domain;
public class User { }file-scoped namespace는 한 파일에 하나의 namespace만 있을 때 사용합니다. 불필요한 들여쓰기가 줄어들어 현재 대부분의 프로젝트에서 선호됩니다.
global using — 프로젝트 전역 공통 선언
global using (C# 10+)은 한 번 선언하면 프로젝트 전체 파일에서 자동으로 적용됩니다. 반복되는 using System;을 제거할 때 유용합니다.
// GlobalUsings.cs (보통 별도 파일로 관리)
global using System;
global using System.Collections.Generic;
global using System.Linq;.NET 6+의 <ImplicitUsings>enable</ImplicitUsings> 프로젝트 설정은 자주 쓰이는 namespace를 자동으로 global using으로 추가합니다.
alias — 이름 충돌 해결
같은 이름의 타입이 두 namespace에 있거나, 긴 타입 이름을 짧게 쓰고 싶을 때 alias를 씁니다.
using JsonSerializer = System.Text.Json.JsonSerializer;
using NewtonJson = Newtonsoft.Json.JsonConvert;
// 충돌 없이 둘 다 사용 가능
string text1 = JsonSerializer.Serialize(obj);
string text2 = NewtonJson.SerializeObject(obj);// ❌ using directive와 using statement를 같은 개념으로 보면 읽기가 꼬임
using System.IO;
using var reader = new StreamReader(path);
// ✅ 첫 번째는 이름 가져오기, 두 번째는 자원 수명 관리체크포인트
| 항목 | 설명 |
|---|---|
using System; | 파일에서 해당 namespace 타입을 짧게 사용 |
namespace Game.Tools; | file-scoped namespace 선언 |
global using | 프로젝트 전체에서 공통 using 선언 |
using Alias = Full.Type.Name; | 긴 이름이나 충돌 해결용 별칭 |
using var / using (...) {} | 자원 수명 관리 (directive와 별개) |
주의할 점
using이 두 가지라는 점이 초보자가 가장 자주 혼동하는 부분입니다. 파일 맨 위의 using은 namespace를 여는 directive이고, using var / using (...) 형태는 IDisposable 자원의 수명을 관리하는 statement입니다.
global using을 남용하면 "이 타입이 어느 namespace에서 왔는지"가 불분명해집니다. 자주 쓰이는 System 계열 namespace에만 제한하고, 프로젝트 내부 namespace는 명시적으로 쓰는 편이 코드 추적에 유리합니다.
참고 링크
2 sources