열거형 두번째 이야기로 비트플래그에 대해서 이야기하겠습니다. 비트플래그를 이해하기 위해서는 비트에 대한 개념이 있어야 합니다.


비트플래그에서는 비트를 구성하는 0과 1을 참 거짓으로 표현하여 현재 상태를 나타내는 것입니다.

우선 0은 거짓을 표현하고 1은 참을 표현해요.

예를 들어 과일을 표현하는 enum이 있다고 하겠습니다.

public enum Fruit
{
    None = 0,
    Apple = 1,
    Banana = 2,
    Peach = 4
}

비트플래그를 위해서 항상 None이라는 것이 필요하고 0으로 설정합니다. 그리고 다음 enum부터 1, 2, 4, 8, 16이런식으로 표현합니다.

여기서 0, 1, 2, 4, 8, 16이란 숫자에 주목해야하는데요.

이 숫자를 이진수로 표현해보겠습니다.

(10)                (2)
0          00000000000
1          00000000001
2          00000000010
4          00000000100
8          00000001000
16        00000010000

이제 이 숫자들이 어떤 특징이 있는지 보이시나요?
바로 이진수의 자리마다 한개의 1을 사용하고 있습니다.
잘 이해가 안가시죠? 이제 enum과 위에 숫자들을 연관시켜보겠습니다.

Peach    Banana    Apple
   0               0              0           
   0               0              1           
   0               1              0           
   1               0              0           

이진수 000 의 경우 십진수로 0이고 어떤 과일도 선택안된 상태인 None 입니다.

이진수 001 의 경우 십진수로 1이고 사과가 선택된 상태입니다.

이진수 010 의 경우 십진수로 2이고 바나나가 선택된 상태입니다.

이진수 100 의 경우 십진수로 4이고 복숭아가 선택된 상태입니다.

각 자리수에 0이면 선택되지 않은거고 1이면 선택된 상태가 됩니다.

따라서 110은 복숭아와 바나나가 선택된 상태가 됩니다.

코드로 보면

Fruit.Banana | Fruit.Peach 라서 쓰면
010 | 100 이라는 비트연산이 되고
연산결과는 110이됩니다. 해석하면 바나나 또는 복숭아라는 뜻이 되기에 선택한 enum에 복숭아와 바나나가 모두 선택된 뜻처럼 사용되는거죠.
참고로 enum 에서 All 을 표현하기 위해서는 
~0 이라는 키워드를 사용하면 됩니다. 


public enum Fruit
{
    None = 0,
    Apple = 1,
    Banana = 2,
    Peach = 4,
    All = ~0,
}



+ Recent posts