C#시작과 문법

nameof / typeof / sizeof

nameof()의 리팩토링 안전성, typeof()와 GetType()의 차이, sizeof()의 값 타입 크기 확인 용도와 unsafe 없이 쓸 수 있는 범위를 정리합니다.

마지막 수정 2026년 3월 26일

기본 패턴

csharp
// nameof — 리팩토링 안전한 이름 문자열
void Save(string name)
{
    ArgumentNullException.ThrowIfNull(name, nameof(name));
}

// typeof — 컴파일 시점 타입 객체
Type t = typeof(DateTime);
Console.WriteLine(t.FullName);   // System.DateTime

// GetType — 런타임 실제 타입
object obj = "hello";
Console.WriteLine(obj.GetType());            // System.String
Console.WriteLine(obj.GetType() == typeof(string)); // true

// sizeof — 기본 값 타입 크기 (바이트)
int size = sizeof(int);   // 4
int size2 = sizeof(long); // 8

설명

nameof() — 리팩토링 안전한 이름 문자열

nameof(식별자) 는 변수, 파라미터, 멤버, 타입의 이름을 컴파일 시점에 문자열로 반환합니다. 하드코딩된 문자열과 달리, 이름을 바꾸면 컴파일러가 자동으로 추적합니다.

csharp
// 예외 메시지
void Process(Order order)
{
    ArgumentNullException.ThrowIfNull(order, nameof(order));
    // → "order" 문자열, 파라미터 이름 변경 시 자동 반영
}

// INotifyPropertyChanged 구현
private string _name = "";
public string Name
{
    get => _name;
    set
    {
        _name = value;
        OnPropertyChanged(nameof(Name)); // "Name"
    }
}

// 로그, 예외 메시지
throw new InvalidOperationException(
    $"{nameof(ProcessPayment)} 실패: 잔액 부족");

typeof() vs GetType()

typeof(T)컴파일 시점에 알려진 타입의 Type 객체를 반환합니다. GetType()런타임에 인스턴스의 실제 타입을 반환합니다. 상속 관계에서 두 값이 달라질 수 있습니다.

csharp
Animal a = new Dog();

typeof(Animal) == a.GetType()  // false — GetType()은 Dog를 반환
typeof(Dog)    == a.GetType()  // true

// typeof는 제네릭 정의에도 사용 가능
Type listDef = typeof(List<>);
Console.WriteLine(listDef.IsGenericTypeDefinition); // true

Type listInt = typeof(List<int>);
Console.WriteLine(listInt.GenericTypeArguments[0]); // System.Int32

타입 비교가 목적이라면 typeof / is 패턴이 더 명확합니다.

csharp
// ✅ 권장
if (obj is Dog dog) { }

// 정확한 타입 비교가 필요할 때
if (obj.GetType() == typeof(Dog)) { }  // 파생 타입 제외
if (obj is Animal)                { }  // 파생 타입 포함

sizeof() — 값 타입 크기

sizeof(T) 는 값 타입의 바이트 크기를 컴파일 시점에 반환합니다. 기본 타입은 unsafe 없이 사용 가능합니다.

csharp
sizeof(bool)   // 1
sizeof(byte)   // 1
sizeof(char)   // 2 (UTF-16)
sizeof(int)    // 4
sizeof(long)   // 8
sizeof(double) // 8
sizeof(decimal)// 16

커스텀 struct의 크기가 필요하면 unsafe 없이도 Unsafe.SizeOf<T>() 를 사용할 수 있습니다.

csharp
// unsafe 없이 struct 크기 확인
int size = System.Runtime.CompilerServices.Unsafe.SizeOf<MyStruct>();

빠른 정리

연산자평가 시점반환값주요 용도
nameof(x)컴파일string리팩토링 안전 이름, 예외 메시지
typeof(T)컴파일Type리플렉션, 제네릭 타입 정보
GetType()런타임Type인스턴스 실제 타입 확인
sizeof(T)컴파일int기본 값 타입 바이트 크기
Unsafe.SizeOf<T>()컴파일int커스텀 struct 크기 (unsafe 불필요)

주의할 점

typeof(T)GetType()은 다형성 환경에서 다른 결과를 냅니다. 파생 타입까지 포함해 검사하려면 is 패턴 매칭을, 정확히 그 타입만 확인하려면 GetType() == typeof(T)를 사용하세요.

nameof멤버 접근 경로의 마지막 이름만 반환합니다. nameof(user.Name)"Name"을 반환하며 "user.Name"이 아닙니다. 전체 경로가 필요하면 직접 조합하세요.

참고 링크

2 sources