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 ๊ตฌํ˜„์ฒด์™€๋„ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ๋น„ํŠธ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ๋•Œ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋œ์–ด์คŒ

class Text {
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}

    public void applyStyles(Set<Style> styles) { // ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ์ข‹์Œ
        // ...
    }
}

class Main {

    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}

Last updated

Was this helpful?