본문 바로가기
[ Program ]/C#

C#에서의 Flag attribute를 사용하는 Enum

by 관이119 2013. 1. 24.

 

 

 

 


출처 - http://shibas.tistory.com/5


각 비트 마다 enum이 하나씩 들어가게끔 설정하여 bit array를 사용하듯이 enum을 사용할 수 있다.
예를 들어, 아래와 같이 enum을 설정한 경우

enum TestEnum
{
       Red     - 0001(1)
       Green  - 0010(2)
       Blue    - 0100(4)
}

0101은 아래와 Red & Blue로 해석할 수 있으므로 아래처럼 처리할 수 있다.

    0001  // Red
 & 0100  // Blue
-------
    0101  // Red & Blue


즉 'val이 Red이거나 val이 Blue라면?' 즉,  'if(val == Red || val == Blue)'를 표현하고 싶을 때 아래와 같이 사용 가능하다.

if( (val & Red == TestEnum.Red) || (val & Blue == TestEnum.Red) )   // 비트 연산이므로 & 사용..
{
       // val이 빨강이거나 파랑이면 여기를 실행.
}

Flags가 설정되지 않은 경우에는  0101을 Red & Blue가 아닌 Yellow같은 또 다른 하나의 색깔을 갖는 단순 enum이 될 수밖에 없다.
하지만 enum에 Flags 속성을 줌으로써 가능하다.


사용법)
1. [Flags] 또는 [FlagsAttribute] 어트리뷰트를 enum의 앞에 붙여준다.
2. enum 정의시 0부터 2의 배수로 설정한다. 0, 1, 2, 4, 8, 16...

사용 예1) MSDN 예제






그림 1. Flags를 사용하지 않는 SingleHue와 Flag를 사용하는 MultiHue


 



그림 2. SingleHue와 MultiHue 출력 테스트


사용예 2) 프로그램의 각 기능에 대해 권한을 설정해야 한다.
              단순히 권한이 있다, 없다만 있을 경우 각 권한을 bool로 설정하면 된다.
             하지만, 이 프로그램은 사용 유저에 따라 아예 사용하지 않는 기능에 대하여 '사용하지 않음' 설정이 필요하다.
             예를 들어, 기능 3개짜리 버전과 기능 5개짜리 버전의 두 가지가 필요할 경우, 2개 기능은 막아야 한다.
            즉, 아래와 같이 3가지의 상태가 필요하다.

            1 권한이 있다2 권한이 없다(사용가능한 기능이다)
            3 사용할 수 없는 기능이다(권한이 있으나 없으나 상관없네~ 사용할 수 없는 기능이니까..)


           이럴 경우, 아래와 같이 설정하는 것도 하나의 방법이다.




첫 번째 비트는 사용할 수 있다, 없다
두 번째 비트는 권한이 있다, 없다

사용자는 TRUE냐 FALSE냐로만 구분하여 bool로 사용할 수 있다.(FALSE는 사용할 수 없거나, 사용할 수 있으나 권한이 없는 경우)
즉 아래와 같은 클래스가 있다고 치자.




if(bShowApplication)
{
   // 사용할 수 있는 기능이고, 권한이 있을 경우만 이 곳을 처리한다.
}



댓글