55. enum 내부 표현 · [Flags] · HasFlag 박싱 · 캐스팅

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 주제: enum 의 내부 표현 · 기저형 · [Flags] · HasFlag 박싱 · 캐스팅
//
// 과제:
//   1) enum 은 런타임에 사실상 기저 정수형(default int)의 "이름 붙은 상수"일 뿐이다.
//      정의되지 않은 정수값도 캐스팅으로 담길 수 있는 이유를 설명하라.
//   2) [Flags] 의 의미(비트 조합), ToString 표기, HasFlag 의 동작과 박싱 비용을 설명하라.
//   3) 기저형을 byte 로 바꾸면 무엇이 달라지나? Enum.GetUnderlyingType / IsDefined 는?
//   4) 아래 프로그램의 출력을 예측하라.

using System;

[Flags]
public enum Perm { None = 0, Read = 1, Write = 2, Exec = 4 }

public enum Color : byte { Red = 1, Green = 2 }

public static class Program
{
    public static void Main()
    {
        Perm p = Perm.Read | Perm.Write;
        Console.WriteLine((int)p);                          // (1)
        Console.WriteLine(p);                               // (2)
        Console.WriteLine(p.HasFlag(Perm.Write));           // (3)
        Console.WriteLine(p.HasFlag(Perm.Exec));            // (4)

        Color c = (Color)99;                                // 정의되지 않은 값
        Console.WriteLine(c);                               // (5)
        Console.WriteLine(Enum.IsDefined(typeof(Color), c));// (6)
        Console.WriteLine(Enum.GetUnderlyingType(typeof(Color))); // (7)

        Perm none = 0;
        Console.WriteLine(none == Perm.None);               // (8)
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.