다음 문제를 풀어 보자.
문> 다음 코드에서 잘못 된 부분을 찾아 올바로 고치시오
[Flags]
enum LogType { File = 1, Database = 2, EventLog = 3 }
문제를 쉽게 풀었다면 패스~~
Enum을 정의할 때 FlagAttribute를 적용하면, 열거형 값들을 조합해서 사용할 수 있다.
예를 들어 File과 Database 두 값 모두 라는 의미로 다음과 같은 코드 사용이 가능하다
LogType logType = LogType.File | LogType.Database
...
bool isFile = (myType & LogType.File) == LogType.File;
FlagAttribute는 Enum을 BIT Flag 처리가 가능하도록 설정하는 것이다.
BIT Flag의 동작 방식을 이해하고 있었다면, 문제를 쉽게 풀었을 것이다.
열거자 목록에 사용된 값들의 bit가 켜고 끄는 형태 즉, On/Off 형태가 되도록 구성해야 한다.
그래야 bit의 OR / AND 연산이 제대로 동작하게 되는 것이다.
다시 말해, 각 값들의 비트 구성이 다음과 같도록 구성해야 한다.
따라서 정답은 다음과 같다.
[Flags]
enum LogType { File = 1, Database = 2, EventLog = 4 }
이제 다음 코드의 의미를 다시 보면,
LogType logType = LogType.File | LogType.Database
정수 1과 2(비트 1과 10)의 비트를 (OR 연산으로) 모두 ON 상태로 만드는 것이다.
그리고 다음 연산으로 자신의 비트만 켤수 있도록 비교하게 된다.
(myType & LogType.File) == LogType.File
----------------------------------------------------------------------------------------
여기서 좀 더 세련된 코딩을 하자 치면...
이러한 비트 구성은 2의 제곱형태가 되는 걸 알 수 있다.
즉 비트가 왼쪽으로 한 칸씩 쉬프트되는 구조 이므로 다음과 같이 코딩할 수 있겠다
[Flags]
enum LogType { File = 1 << 0, Database = 1 << 1, EventLog = 1 << 2 }
-------------------------------------------------------------------------------------
마지막으로 전체 선택은 비트를 모두 켠(ON) 것이고,
그 반대는 비트를 모두 끈(OFF)한 것이므로 다음과 같이 코딩하면 된다.
[Flags]
enum LogType
{
None = 0,
File = 1 << 0, Database = 1 << 1, EventLog = 1 << 2,
All = File | Database | EventLog
}
열거자 값이 많고 계속 늘어날 수 있는 경우 모든 비트가 켜진 정수의 최대값을 지정해되 된다.
All = Int32.MaxValue
'.NET Framework' 카테고리의 다른 글
IOC using Ninject (2) | 2013.06.18 |
---|---|
Security in OAuth (4) | 2013.05.29 |
TimeStampHasCreationTimeInFuture in WCF Security 2 (4) | 2013.05.23 |
TimeStampHasCreationTimeInFuture in WCF Security (4) | 2013.05.14 |
serviceThrottling in WCF (4) | 2013.05.13 |