정보공간_1

[4기 광주 박주연] 비트 연산을 사용한 스타일 처리 본문

IT 놀이터/Elite Member Tech & Talk

[4기 광주 박주연] 비트 연산을 사용한 스타일 처리

알 수 없는 사용자 2013. 11. 5. 10:58

비트 연산을 사용한 스타일 처리


  책에서 프로그래밍을 배울 때 비트 연산을 배우고 나서 보통 어디에 사용하지?’ 라는 물음을 한번씩 갖게 됩니다. 어디에 사용되고 있을까요? 혹시 한번쯤 생각해 본적이 있나요? 저는 이번 글을 통해서 비트 연산이 사용되는 것 중 하나인 스타일 처리의 원리에 대해 설명하고 간단한 예제를 작성해 보려고 합니다.

 

  먼저 책에서 배웠던 비트연산에 대해 되짚어 봅시다. [그림 1]은 비트 연산자와 비트 연산의 결과에 대한 예시 입니다. 비트 연산의 결과 중에서도 비트 AND와 비트 OR의 연산 결과는 조금 흥미롭습니다. 비트 AND의 경우 특정 비트 열에 1로 연산 했을 때 같은 열의 비트가 1일 때 결과 또한 1이 되며 그 외의 경우는 결과가 0 됩니다. 비트 OR의 경우는 특정 비트 열에 1로 연산을 할 경우 기존 비트가 0 또는 1에 상관없이 결과가 1이 됩니다. 이러한 동작은 특정 비트의 값이 1로 설정되어 있는지 확인하거나 또는 특정 비트의 값을 1로 설정하는데 사용할 수 있습니다.


그림 1. 비트 연산의 예

  비트 연산을 사용한 스타일 처리 원리는 앞서 설명한 두 동작에 대한 원리를 기반으로 합니다. 스타일 처리에는 스타일을 갖는 스타일 변수(styleValue), 스타일 옵션의 항목들에 대한 정의, 그리고 스타일 처리에 대한 메소드(함수)로 구성되며 [그림 2]는 스타일 처리에 대한 동작 개념을 보여줍니다.

  32비트를 갖는 int 형 변수로 styleValue를 선언하여 32개 속성을 저장할 수 있도록 했고 스타일 자체에 대한 정의는 #define 문을 통해 정의하고 있습니다. 그리고 스타일 처리는 “setStyle()” 메소드와 “isEnableStyle()”를 통해 처리되도록 합니다. 이 두 메소드 내부에서는 앞서 설명된 비트 OR 연산과 비트 AND 연산을 통해 스타일의 설정과 설정 확인의 동작을 구현하게 됩니다.


그림 2. 스타일 처리의 동작 개념

  비트 연산을 사용해 스타일(속성) 처리를 할 경우 주의해야 할 점은 비트 연산이기 때문에 각 비트에 대한 설정 정의가 겹치지 않도록 해야 합니다. 즉 스타일 자체에 대한 정의 값은 2의 배수의 값이 겹치지 않도록 설정되어야 한다는 점입니다.

  원리를 알아봤으니 이제 어떤 부분에서 응용되고 있었는지를 살펴 보겠습니다. GUI(Graphic User Interface)를 만들기 위한 프로그래밍을 하다 보면 MFC(Microsoft Foundation Class Library)나 SWT(Standard Widget Toolkit) 등을 사용해 보셨을 것입니다. 이러한 GUI 작성 코드에도 비트 연산을 이용한 스타일 처리가 응용되어 있습니다. [그림 3]은 MFC의 GUI 초기화 부분 [그림 4]는 SWT의 초기화 코드 중 일부를 보여 주며 앞에서 설명된 비트 연산을 이용한 스타일 처리의 동작 개념과 유사한 부분을 가지고 있는 것을 알 수 있습니다.


그림 3. MFC window의 스타일 설정 예

  윈도우의 스타일에 대한 정의는 WinUser.h 내에 정의되어 있으며 2의 배수 값을 설정하면서 각 각의 비트를 통해 정의하는 스타일의 의미가 중복되지 않도록 하는 것을 볼 수 있습니다.


그림 4. WinUser.h 파일의 스타일 정의

[그림 5]는 SWT에서의 GUI component에 대한 스타일 설정의 예를 보여줍니다. 리스트 박스에 대한 스타일로 테두리, 다중 선택, 수직 스크롤을 설정한 것을 알 수 있습니다.


그림 5. SWT의 스타일 설정 예

  위에서 살펴본 스타일 처리의 예를 통해서 알 수 있듯이 비트 연산을 사용하면 목적 대상(객체)에 대한 스타일 설정 별로 설정(setter)과 확인(getter) 메소드를 추가적으로 정의하지 않더라도 기존 메소드 형태를 유지한 상태에서 선택적으로 스타일에 대한 작업이 가능하게 됩니다.
 [그림 6]은 비트 연산을 통한 스타일 처리와 스타일 각 각에 대한 설정, 확인 메소드를 가지는 형태를 비교한 것입니다. 그림에서 보는 것 처럼 비트 연산을 이용해 스타일을 처리할 경우 Option을 Style 메소드를 통해 선택적으로 설정할 수 있는 반면 각 스타일에 대한 메소드를 만들어 사용할 경우 표현하고자 하는 스타일의 수에 따라 설정, 확인 메소드에 대한 수가 증가 하는 것을 볼 수 있습니다.


그림 6. 스타일에 대한 메소드 비교

  지금까지의 설명을 통해서 책의 앞머리에서 배웠던 비트 연산이 응용되는 것 중에 하나인 스타일 처리에 대해서 살펴 보았습니다. 설명을 통해 비트 연산을 논리 회로 시간에 배웠던 논리 게이트의 연산과 비슷한 처리를 하는 것으로만 이해하는 것에 끝나지 않고 스타일 처리와 같은 부분에 이용되는 것을 알 수 있었습니다.
 마지막으로 비트 연산을 이용한 간단한 예제와 실행 결과를 첨부하는 것으로 이번 글을 마치겠습니다.

감사합니다. ^^


예제 코드

 

  1 package org.secmem.blog.ex;
  2 
  3 public class StyleHandleExample {
  4 
  5 	public static final int OPTION1 = 0x1;  // or 0x1 << 1
  6 	public static final int OPTION3 = 0x2;  // or 0x1 << 2
  7 	public static final int OPTION2 = 0x4;  // or 0x1 << 3
  8 	
  9 	private int styleValue = 0x0;
 10 
 11 	public static void main(String[] args) {
 12 		
 13 		StyleHandleExample style= new StyleHandleExample();
 14 		style.setStyle(StyleHandleExample.OPTION1 | StyleHandleExample.OPTION3);
 15 		
 16 		System.out.println("option1: " + style.isEnableStyle(StyleHandleExample.OPTION1));
 17 		System.out.println("option2: " + style.isEnableStyle(StyleHandleExample.OPTION2));
 18 		System.out.println("option3: " + style.isEnableStyle(StyleHandleExample.OPTION3));
 19 	}
 20 
 21 	private void setStyle(int style) {
 22 		styleValue = style;
 23 	}
 24 
 25 	private boolean isEnableStyle(int style) {
 26 		return (styleValue & style) > 0;
 27 	}
 28 }
 29 


실행 결과

option1: true
option2: false
option3: true