아이템 36. 비트 필드 대신 EnumSet을 사용하라. #91
-
📝 9️⃣성 Table of contents generated with markdown-toc 0. 들어가기에 앞서 🧐
1. 비트 필드 ✨비트 필드는 컴퓨터 과학의 역사 초기에 개발된 1.1 비트 필드 사용비트 필드를 사용하면 비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다.
Color 클래스package item36;
public class Color {
public static final int RED = 1; // 1 << 0
public static final int GREEN = 2; // 1 << 1
public static final int BLUE = 4; // 1 << 2
private int colors;
public int getColors() {
return colors;
}
public void setColors(int colors) {
this.colors = colors;
}
} 데모 클래스package item36;
public class DemoBitFieldsColor {
private Color demoColor;
public void setBitFields() {
this.demoColor = new Color();
this.demoColor.setColors(Color.RED | Color.GREEN);
}
public void printColors() {
if (demoColor.getColors() == (Color.RED | Color.GREEN)) {
System.out.println("YELLOW");
}
System.out.println("-- 포함된 색상 --");
if ((demoColor.getColors() & Color.RED) > 0) {
System.out.println("RED");
}
if ((demoColor.getColors() & Color.BLUE) > 0) {
System.out.println("BLUE");
}
}
}
1.2 비트 필드의 문제점1. 제한된 확장성
어느날 갑자기 위의 예제는 짧았지만, 만약 수 많은 메서드가 있었고 비트 연산 값 3을 이용하고 있는 메서드가 많았다면? 그렇지 않기를 기대 하겠지만, 인생은 항상 굴곡지다. 2. 부적절한 캡슐화
다시는 비트 필드를 쓰지 않길 다짐하며 🪓 2. 비트 필드 대신 EnumSet을 사용하라 ⭐️
2.1 EnumSet 이란?
2.2 EnumSet 사용시 고려할 사항
2.3 EnumSet의 구현체EnumSet은 추상 클래스이다.
2.4 비트 필드 컬러 클래스를 EnumSet으로 리팩토링 해보자 💎리팩토링 된 Color 클래스package item36.ver2;
public enum Color {
RED,
GREEN,
BLUE
} 리팩토링 된 데모 클래스package item36.ver2;
import java.util.EnumSet;
import java.util.Set;
public class DemoEnumSetColor {
private EnumSet<Color> demoColor;
public void setEnumSetColor(Set<Color> color) {
this.demoColor = EnumSet.of(Color.RED, Color.GREEN);
}
public void printColors() {
if (demoColor.contains(Color.RED) && demoColor.contains(Color.GREEN)) {
System.out.println("YELLOW");
}
System.out.println("-- 포함된 색상 --");
if (demoColor.contains(Color.RED)) {
System.out.println("RED");
}
if (demoColor.contains(Color.BLUE)) {
System.out.println("BLUE");
}
}
} 실행결과는 같다.
3. 핵심 정리 📚
4. 회고 🧹2023.01.28 (토)
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 5 replies
-
빛의 색 3개로 표현할 수 있는 케이스가 2^3 = 8가지 인데 모든 케이스를 다 저장하기 보단 비트 필드는 아두이노를 이용해 LED 빛을 표현할때 많이 쓰곤 했던것 같습니다. 웹 애플리케이션을 구현할 때도 특정 옵션을 선택하는 경우 선택하지 않은 경우가 있을 것이고 |
Beta Was this translation helpful? Give feedback.
-
리플렉션에서 modifier 다룰때 or 연산 많이 사용했었는데.. EnumSet 사용하면 이렇게 직관적인 코드로 바뀌는군요 |
Beta Was this translation helpful? Give feedback.
빛의 색 3개로 표현할 수 있는 케이스가 2^3 = 8가지 인데 모든 케이스를 다 저장하기 보단
빨, 초, 파를 비트 필드로 두고 OR 연산을 통해 여러 케이스를 만들 수 있게 되네요 ㅎㅎ
비트 필드는 아두이노를 이용해 LED 빛을 표현할때 많이 쓰곤 했던것 같습니다.
1, 2, 3번 LED가 있을때 1만 키고 싶을때, 1, 3을 키고 싶을 때, 1, 2, 3 모두 키고 싶을때가 다양한데
1번 LED : 첫 번째 비트
2번 LED : 두 번째 비트
3번 LED : 세 번째 비트
로 두고 0인 경우 off, 1인 경우 on 으로 하여 3 비트로 모든 케이스를 나타낼 수 있게 되는데 위 예제가 이와 비슷한 것 같습니다.
웹 애플리케이션을 구현할 때도 특정 옵션을 선택하는 경우 선택하지 않은 경우가 있을 것이고
이러한 옵션이 매우 많다면 여러 케이스를 관리하기가 힘들텐데
비트 필드를 이용한다면 조금더 편리해질 것 같고
좀 더 나아가서 이번 주제에 맞게 비트 필드 대신 EnumSet을 이용한다면 훨씬 관리하기 좋은 코드가 될 것 같습니다.!!