Item 36. EnumSet

λΉ„νŠΈ ν•„λ“œ λŒ€μ‹  EnumSet을 μ‚¬μš©ν•˜λΌ

μ—΄κ±°ν•œ 값듀이 μ§‘ν•©μœΌλ‘œ μ‚¬μš©λ˜λŠ” 경우, μ˜ˆμ „μ—λŠ” 각 μƒμˆ˜μ— μ„œλ‘œ λ‹€λ₯Έ 2의 κ±°λ“­μ œκ³± 값을 ν• λ‹Ήν•œ μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ˜€λ‹€.

class Text {
    public static final int STYLE_BOLD = 1 << 0; // 0001
    public static final int STYLE_ITALIC = 1 << 1; // 0010
    public static final int STYLE_UNDERLINE = 1 << 2; // 0100
    public static final int STYLE_STRIKETHROUGH = 1 << 3; // 1000

    public void applyStyles(int styles) {
        // ...
    }
}

class Main {

    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(STYLE_BOLD | STYLE_ITALIC); // 0011
    }
}

λΉ„νŠΈλ³„ OR을 μ‚¬μš©ν•΄ μ—¬λŸ¬ μƒμˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ§‘ν•©μœΌλ‘œ λͺ¨μ„ 수 있으며, μ΄λŸ¬ν•œ 집합을 λΉ„νŠΈ ν•„λ“œ(bit field)라고 ν•œλ‹€. λΉ„νŠΈ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λΉ„νŠΈλ³„ 연산을 μ‚¬μš©ν•΄ μ§‘ν•© 연산을 효율적으둜 μˆ˜ν–‰ν•  수 μžˆμœΌλ‚˜, μ •μˆ˜ μ—΄κ±° μƒμˆ˜μ˜ 단점을 κ·ΈλŒ€λ‘œ κ°–κ³  있으며, 좔가적인 단점도 μ‘΄μž¬ν•œλ‹€.

  • λΉ„νŠΈ ν•„λ“œ 값이 κ·ΈλŒ€λ‘œ 좜λ ₯되면 λ‹¨μˆœν•œ μ •μˆ˜ μ—΄κ±° μƒμˆ˜λ₯Ό 좜λ ₯ν•  λ•Œλ³΄λ‹€ ν•΄μ„ν•˜κΈ°κ°€ 훨씬 어렀움

  • λΉ„νŠΈ ν•„λ“œμ— 적용된 λͺ¨λ“  μ›μ†Œλ₯Ό μˆœνšŒν•˜κΈ° κΉŒλ‹€λ‘œμ›€

  • μ΅œλŒ€ λͺ‡ λΉ„νŠΈκ°€ ν•„μš”ν•œμ§€λ₯Ό API μž‘μ„± μ‹œ 미리 μ˜ˆμΈ‘ν•˜μ—¬ μ μ ˆν•œ νƒ€μž…μ„ 선택해야 함

EnumSet

μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ JavaλŠ” EnumSetμ΄λΌλŠ” νŠΉμˆ˜ν•œ Set κ΅¬ν˜„μ²΄λ₯Ό μ œκ³΅ν•œλ‹€. λ‚΄λΆ€μ μœΌλ‘œλŠ” λΉ„νŠΈ λ²‘ν„°λ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄, μ›μ†Œκ°€ 총 64개 μ΄ν•˜λΌλ©΄ long λ³€μˆ˜ ν•˜λ‚˜(RegularEnumSet)둜 ν‘œν˜„ν•˜λ©°, κ·Έ 이상이라면 long λ°°μ—΄(JumboEnumSet)을 μ‚¬μš©ν•œλ‹€. EnumSet을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ 얻을 수 μžˆλŠ” μž₯점은 μ•„λž˜μ™€ κ°™λ‹€.

  • μ—΄κ±° νƒ€μž… μƒμˆ˜μ˜ κ°’μœΌλ‘œ κ΅¬μ„±λœ 집합을 효과적으둜 ν‘œν˜„

  • νƒ€μž… μ•ˆμ „ν•˜κ³  λ‹€λ₯Έ Set κ΅¬ν˜„μ²΄μ™€λ„ ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯

  • λΉ„νŠΈλ₯Ό 직접 λ‹€λ£° λ•Œ κ²ͺ을 수 μžˆλŠ” λͺ¨λ“  문제λ₯Ό λœμ–΄μ€Œ

Last updated