'enum'에 해당되는 글 1건

최초 작성일 : 2010/04/16 13:26 






열거형 상수인 enum은 객체의 상태를 정의하거나 속성을 정의하기 위해 많이
쓰이는데요. 위의 1, 2의 예와 같이 상수 값을 할당하는 방법이 다릅니다.

1번은 그냥 정수값으로 할당을 하였고 2번은 shift연산 혹은 16진수 표기법으로
할당을 하였습니다. 이 두 가지의 차이점이 무엇일까요?

다음의 내용은 네이버 '맥부기 아이폰OS 개발자모임'카페의 artiechoi께서
정리해주신 내용입니다.

단순한 이유이지만 전산학에서 매우 중요한 이유입니다.
0,1,2로 진행시키는건 그냥 하나만 선택할 때 쓰입니다. 상호배타적이라 표현하구요.
radio버튼 생각하면 됩니다.

linear하게 증가하지 않고, 비트단위로 증가된다면 이는 여러 개 선택할 수 있게 하기 위함입니다.
checkbox개념이죠. or 연산(|)으로 이렇게 할수 있습니다. 주로 속성같은것 정의할때 이렇게 많이 합니다.

StateHighlighted|StateDisabled 이렇게 하면
하이라이팅이면서 디스에이블드 되었다는 의미이죠
 이렇게 or연산이 되어야 하기 때문에, 비트단위로 서로 구분되어야합니다. 이론상, int가 4byte이면,32개까지 열거할 수 있겠지요. (참고로, 위의 예에서 0은 노말이므로, 노멀고 어떤 것고 or해도 모두 무시됩니다. )

0x000001, 0x000002, 0x000004, 0x000008, ... 이렇게 2의 n승으로 정의된것들도 모두 같은 의미입니다.
(1을 하나씩 왼쪽으로 shift하는 것이 2의 n승이므로)

정리하면 그냥 정수로 할당한 것은 한 번에 한가지의 상태밖에 가질 수 없는, 즉
어떠한 '상태'를 표현하기 위해 주로 쓰이고 shift연산을 사용한 것은 객체의 '속성'을
표현하기 위해 주로 사용된다고 보시면 되겠네요.

예를들어 1번의 예는 객체 내에서의 콘텐트의 가로 정렬을 표현하는 열거형 상수입니다.
즉, 우측 정렬인지, 좌측 정렬인지, 중앙 정렬인지, 양끝 정렬인지...
이러한 내용들은 한 번에 하나 밖에는 가질 수 없는 상태입니다. 따라서 그냥
정수로 상수값을 할당해서 하나만 선택하게 한 것이죠.

하지만 2번의 경우 어떤 Control 객체의 속성을 열거형 상수로 정의해놓은 것인데요.
보면시 Highlight 속성, Disable 속성, Select 속성 3가지가 shift연산으로 정의되어
있습니다. 즉, 이 컨트롤은 이 세가지 속성중에 하나 이상을 중복해서 가질 수 있다는
말입니다. 하이라이트됨과 동시에 비활성화되어있을 수도 있고, 선택된 상태에서
하이라이트 될 수도 있는 것이죠. 이렇게 중복해서 가질 수 있는 속성은 나중에
실 사용에서 비트 or(|) 연산으로 연결됩니다.

이 내용을 전산적으로 볼까요?

1번의 경우입니다.
우선 정수를 2진수로 표현해보죠.
1 -> 0001
2 -> 0010
3 -> 0011
이런 경우 or(|) 연산을 하면 어떻게 될까요?
1 | 2 = 0011
1 | 3 = 0011
2 | 3 = 0011

네...모두 3만 나오네요. 결국 정수로 값이 할당된 상수들은 or(|) 연산을 해봐야
가장 큰 값밖에 안나오므로 한 번에 하나의 값만을 선택해서 사용할 수밖에 없습니다.

그럼 2번의 경우는 어떨까요? << 연산자는 좌측의 값을 우측의 값만큼 오른쪽으로
이동시키라는 비트 연산자죠? 다음과 같습니다.

1<<0 = 0001
1<<1 = 0010
1<<2 = 0100

이 값을을 가지고 or(|) 연산을 해볼까요?

(1<<0) | (1<<1) = 0011
(1<<0) | (1<<2) = 0101
(1<<1) | (1<<2) = 0110
(1<<0) | (1<<1) | (1<<2) = 0111

아...모두 다른 값이 나오네요.
즉 or(|) 연산을 통해 각각의 속성을 모두 표현할 수 있다는 말이죠.

이것이 상수에 어떤 값을 할당하는지를 결정하는 이유였네요...^^

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요