
여기서 구독을 완료하고
로그인을 했을 때 내 구독정보를 확인하고자 한다!!!!
그런데, 구독정보에서 사용자마다 선택한 요일도 다르고 갯수도 다르기 때문에 어떻게 관리할지 고민이 됐다
를 튜터님께 다같이가서 상담했을때 비트로 관리하는 좋은 방법을 알려주셔서 적용해보고자 한다!!!
| 요일 | 비트 위치 | 비트 값 |
|---|---|---|
| 일요일 | 0 | 1 << 0 = 1 |
| 월요일 | 1 | 1 << 1 = 2 |
| 화요일 | 2 | 1 << 2 = 4 |
| 수요일 | 3 | 1 << 3 = 8 |
| 목요일 | 4 | 1 << 4 = 16 |
| 금요일 | 5 | 1 << 5 = 32 |
| 토요일 | 6 | 1 << 6 = 64 |
이런식으로 각 자리마다 한칸씩 차지하는 것이다
일요일이 0값이니 가장오른쪽에 서겠고..

사용자가 월·수·금을 선택했다면:
→ 2 + 8 + 32 = 42
→ 0b101010
이런식으로 표현이 된다
중복된 값이 나올수가 없으니 int로 표현된 요일값은 항상 정해진 값이 나올수 밖에없음
(42를 2의 제곱수의 합 + 겹치지 않는 값 으로 표현하는 방법이 딱 하나인 것)
@Getter
@RequiredArgsConstructor
public enum DayOfWeek {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

이렇게 되는 함수가 필요하다
요일을 여러개 지정할 수 있으니깐 중복제거한 List인 Set를 선언해줌
Set<DayOfWeek> -> int 일때 안의 요소들을 for문 돌면서
DayOfWeek -> int 으로 바꿔서 나중에 다 더하기하면 됨
그으 러긴 위해선
ENUM 에다가 각 요일에 맞는 비트값을 넣어주고
DayOfWeek -> int , int -> DayOfWeek 으로 바꿔주는 함수 더해주면되겠지
@Getter
@RequiredArgsConstructor
public enum DayOfWeek {
SUNDAY(0),
MONDAY(1),
TUESDAY(2),
WEDNESDAY(3),
THURSDAY(4),
FRIDAY(5),
SATURDAY(6);
private final int bitIndex;
public int getBitValue() {
return 1 << bitIndex;
}
public static boolean contains(int bits, DayOfWeek day) {
return (bits & day.getBitValue()) != 0;
}
}
이게 DayOfWeek -> int 바꿔주는 함수고
이게 int -> DayOfWeek 으로 바꿔주는 함수다.
// Set<DayOfWeek> -> int
public static int encodeDays(Set<DayOfWeek> days) {
int result = 0;
for (DayOfWeek day : days) {
result |= day.getBitValue();
}
return result;
}
// int -> Set<DayOfWeek>
public static Set<DayOfWeek> decodeDays(int bits) {
Set<DayOfWeek> result = EnumSet.noneOf(DayOfWeek.class);
for (DayOfWeek day : DayOfWeek.values()) {
if (DayOfWeek.contains(bits, day)) {
result.add(day);
}
}
return result;
}
이걸 Subscription 클래스에 붙여줘서 바뢉바로꺼내기 하면되겠따~!!!
바이트를 8분할 해서 비트로 성능 최적화까지... 오늘도 배워갑니다