[JAVA] 3. 비트 필드의 개념과 사용, 문제점

YeongJun Son·2023년 3월 27일
0

비트필드의 개념과 기능, 문제점

비트필드의 기본 개념과 특징

비트필드 기본 개념

비트 필드는 메모리를 절약하기 위한 도구로 쓰였습니다. 비트 필드는 참-거짓 값을 여럿 결합해서 하나의 바이트로 만들어, 메모리를 절약합니다. 이 참-거짓들이 하나의 비트 필드로 묶이는 셈입니다.

특히 C/C++에서 정수형 저장에는 16비트가 필요한 것에 반해, 저장에는 1~2비트만 필요한 경우가 있습니다. 이러한 이유에서, 비트필드는 낮은 값을 갖는 정수 변수가 많을 프로그램일 때, 메모리 소비를 줄일 수 있습니다.

비트 필드 예시와 설명

// Code 1.
package oracle.hcj.constants;
public class Car {
 public final static int POWER_WINDOWS = 1;
 public final static int POWER_LOCKS = 2;
 public final static int SNOW_TIRES = 4;
 public final static int STANDARD_TIRES = 8;
 public final static int CRUISE_CONTROL = 16;
 public final static int CD_PLAYER = 32;
 public final static int AIR_CONDITIONING = 64;
 private int options;
 public Car( ) {
 }
 public void setOptions(final int options) {
 this.options = options;
 }
 public int getOptions( ) {
 return this.options;
 }
}
Fig 1. Options in 'Car'

위 예시에서 비트필드는 여러 옵션을 가질 수 있는데, 이런 옵션들은 정수형으로 비트 필드에 저장됩니다.

바이트 내 비트가 2의 제곱수로 커지기 때문에, 항상 2의 배수를 값으로 가지게 될 겁니다. 그래서 비트 필드는 다른 상수와 구분하기가 쉽습니다.

각 비트마다 1(참) 혹은 0(거짓)으로 해당 옵션의 유무를 나타내게 됩니다.

비트 필드와 비트 어레이 차이

그러나 비트 필드는 비트 어레이와 차이점이 있습니다.

  1. 비트 어레이

    정수 타입보다 크기가 크고, 정수로 인덱스된 많은 비트의 집합을 저장하는 데 쓰입니다.

  2. 비트 필드

    크기가 워드의 크기를 넘지 않습니다.
    여기에서 워드는 명령어나 연산을 통해 저장 장치에서 옮길 수 있는 데이터 단위이자, 한 명령어로 실행될 수 있는 데이터 처리 단위입니다.

비트 필드의 사용과 문제점

비트 필드의 사용

  1. 비트 필드의 대체

    비트 필드는 논리 연산자를 이용해서도 만들 수 있습니다. 각 옵션에 할당된 수가 2의 제곱수임을 고려하면, OR 연산을 이용해 나온 합이 차가 갖는 옵션을 알려준다고도 할 수 있습니다. 어떤 수든 해당하는 비트 조합은 하나인 까닭입니다. 혹은 XOR 연산을 이용해, 쉽게 옵션을 제거할 수도 있습니다.

  2. 비트 필드의 비교

    논리 연산자로 비트 필드를 비교할 수 있습니다. 위의 예시에서 AND 연산자를 이용해, 두 피연산자의 비트를 비교할 수 있습니다. 만약 결과값이 1이라면, 차는 해당 옵션을 가지고 있다고 생각할 수 있습니다.

비트 필드의 문제점

Java에서 비트필드는 JDK 내 리플렉션(reflection)에서의 기능들과 연관됩니다. 리플렉션은 필드, 클래스, 생성자, 혹은 메소드에서 제어자(modifier)를 저장하기 위해 사용됩니다. 그러나 비트 필드는 아래와 같은 문제점이 있습니다.

  1. 상호 배제성 (mutual exclusivity)

    위 예시에서, 차는 standard tire와 snow tire 둘 중 하나만 가질 수 있습니다. 만약 두 타이어 모두에 비트를 둔다면, 데이터가 오염될 수 있습니다.

  2. 제한된 확장성 (limited expandability)

    만약 차에 새로운 옵션이 몇 백 개 추가된다면, 한 정수형 안에는 모든 비트를 담을 수가 없습니다. 만약 코드를 바꿀 수 있다해도, 기본적인 객체 지향에서의 캡슐화를 어기게 됩니다.

  3. 부적절한 캡슐화 (improper encapsulation)

    캡슐화의 근본 원리 중 하나는 클래스 사용자로부터 객체를 숨기는 것입니다. 반면, 비트 필드는 내부 구현을 사용자에게 드러냅니다.

    또한, 여러 옵션을 비트 필드 하나에 귀속시키므로, 인터페이스가 어지러워 집니다. 어떤 옵션을 가지고 있는지 확인하기 위해서는 다른 옵션을 확인할 필요가 없어야 합니다.

    대안으로는, 차 클래스 안에 상호 배제적이지 않은 옵션을 세트로 둘 수 있습니다.

References

[Code 1. , Fig 1.]
http://underpop.online.fr/j/java/hardcore-java/hardcorejv-chp-7-sect-2.html

https://en.m.wikipedia.org/wiki/Bit_field
https://ko.m.wikipedia.org/wiki/워드_(컴퓨팅)

profile
제가 좋아하는 것은 도가 아니라 기입니다

0개의 댓글