item 36 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

๋น„ํŠธ ํ•„๋“œ ๋Œ€์‹  EnumSet์„ ์‚ฌ์šฉํ•˜๋ผ

  • ์—ด๊ฑฐํ•œ ๊ฐ’๋“ค์ด ์ฃผ๋กœ ์ง‘ํ•ฉ์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ์˜ˆ์ „์—๋Š” ๊ฐ ์ƒ์ˆ˜์— ์„œ๋กœ ๋‹ค๋ฅธ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ ๊ฐ’์„ ํ• ๋‹นํ•œ ์ •์ˆ˜ ์—ด๊ฑฐ ํŒจํ„ด์„ ์‚ฌ์šฉ
  • ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ ๋ฐฉ์‹์˜ ๋น„ํŠธ ํ•„๋“œ ์—ด๊ฑฐ ์ƒ์ˆ˜
public class Text  {
     public static final int STYLE_BOLD            = 1 << 0;   // 1
     public static final int STYLE_ITALIC          = 1 << 1;   // 2
     public static final int STYLE_UNDERLINE       = 1 << 2;   // 4
     public static final int STYLE_STRIKETHROUGH   = 1 << 3;   // 8

    // ๋งค๊ฐœ๋ณ€์ˆ˜ styles๋Š” 0๊ฐœ ์ด์ƒ์˜ STYLE_ ์ƒ์ˆ˜๋ฅผ ๋น„ํŠธ๋ณ„ ORํ•œ ๊ฐ’์ด๋‹ค. 
    public void applyStyles(int styles)  { ... }

}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ๋น„ํŠธ๋ณ„ OR๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ์ƒ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ชจ์„ ์ˆ˜ ์žˆ์Œ

๋น„ํŠธ ํ•„๋“œ

text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„ํŠธ๋ณ„ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด ํ•ฉ์ง‘ํ•ฉ๊ณผ ๊ต์ง‘ํ•ฉ ๊ฐ™์€ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„ํŠธ ํ•„๋“œ๋Š” ์ •์ˆ˜ ์—ด๊ฑฐ ์ƒ์ˆ˜์˜ ๋‹จ์ ์„ ๊ฐ€์ง

  • ๋น„ํŠธ ํ•„๋“œ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋ฉด ๋‹จ์ˆœํ•œ ์ •์ˆ˜ ์—ด๊ฑฐ ์ƒ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋ณด๋‹ค ํ•ด์„ํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ต๋‹ค.
  • ๋น„ํŠธ ํ•„๋“œ ํ•˜๋‚˜์— ๋…น์•„ ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ๋„ ๊นŒ๋‹ค๋กญ๋‹ค.
  • ์ตœ๋Œ€ ๋ช‡ ๋น„ํŠธ๊ฐ€ ํ•„์š”ํ•œ์ง€๋ฅผ API๋ฅผ ์ž‘์„ฑ์‹œ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜์—ฌ ์ ์ ˆํ•œ ํƒ€์ž…(๋ณดํ†ต์€ int๋‚˜ long)์„ ์„ ํƒํ•ด ํ•œ๋‹ค. - API๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋น„ํŠธ ์ˆ˜(32๋น„ํŠธ or 64๋น„ํŠธ)๋ฅผ ๋” ๋Š˜๋ฆด ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ •์ˆ˜ ์ƒ์ˆ˜๋ณด๋‹ค ์—ด๊ฑฐ ํƒ€์ž…์„ ์„ ํ˜ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ค‘์—๋„ ์ƒ์ˆ˜ ์ง‘ํ•ฉ์„ ์ฃผ๊ณ  ๋ฐ›์•„์•ผ ํ•  ๋•Œ๋Š” ์—ฌ์ „ํžˆ ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

๋” ๋‚˜์€ ๋Œ€์•ˆ

  • java.util ํŒจํ‚ค์ง€์˜ EnumSet ํด๋ž˜์Šค๋Š” ์—ด๊ฑฐ ํƒ€์ž… ์ƒ์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด์ค€๋‹ค.
  • Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์™„๋ฒฝํžˆ ๊ตฌํ˜„ํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  ๋‹ค๋ฅธ ์–ด๋–ค Set ๊ตฌํ˜„์ฒด์™€๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค.
  • EnumSet์˜ ๋‚ด๋ถ€๋Š” ๋น„ํŠธ ๋ฒกํ„ฐ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
  • ์›์†Œ๊ฐ€ ์ด 64๊ฐœ ์ดํ•˜๋ผ๋ฉด ์ฆ‰ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— EnumSet ์ „์ฒด๋ฅผ long ๋ณ€์ˆ˜ ํ•˜๋‚˜๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๋น„ํŠธ ํ•„๋“œ์— ๋น„๊ฒฌ๋˜๋Š” ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.
  • removeAll๊ณผ retainAll ๊ฐ™์€ ๋Œ€๋Ÿ‰ ์ž‘์—…์€ ๋น„ํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์จ์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • ๋น„ํŠธ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ๋•Œ ํ”ํžˆ ๊ฒช๋Š” ์˜ค๋ฅ˜๋“ค์—์„œ ํ•ด๋ฐฉ๋œ๋‹ค. ๋‚œํ•ดํ•œ ์ž‘์—…์„ EnumSet์ด ๋‹ค ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
import java.util.*;

// ์ฝ”๋“œ 36-2 EnumSet - ๋น„ํŠธ ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ˜„๋Œ€์  ๊ธฐ๋ฒ• (224์ชฝ)
public class Text {
    public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}

    // ์–ด๋–ค Set์„ ๋„˜๊ฒจ๋„ ๋˜๋‚˜, EnumSet์ด ๊ฐ€์žฅ ์ข‹๋‹ค.
    public void applyStyles(Set<Style> styles) {
        System.out.printf("Applying styles %s to text%n",
                Objects.requireNonNull(styles));
    }

    // ์‚ฌ์šฉ ์˜ˆ
    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}

EnumSet - ๋น„ํŠธ ํ•„๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ˜„๋Œ€์  ๊ธฐ๋ฒ•

  • applyStyles ๋ฉ”์„œ๋“œ๊ฐ€ EnumSet<Style>์ด ์•„๋‹Œ Set<Style>์„ ๋ฐ›์€ ์ด์œ ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ EnumSet์„ ๊ฑด๋„ค๋ฆฌ๋ผ ์ง์ž‘๋˜๋Š” ์ƒํ™ฉ์ด๋ผ๋„ ์ด์™•์ด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ›๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ์Šต๊ด€์ด๋‹ค. (์•„์ดํ…œ 64)
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ Set ๊ตฌํ˜„์ฒด๋ฅผ ๋„˜๊ธฐ๋”๋ผ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ต์‹ฌ ์ •๋ฆฌ

์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ํ•œ๋ฐ ๋ชจ์•„ ์ง‘ํ•ฉ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๋Š” ์—†๋‹ค. 
EnumSet ํด๋ž˜์Šค๊ฐ€ ๋น„ํŠธ ํ•„๋“œ ์ˆ˜์ค€์˜ ๋ช…๋ฃŒํ•จ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์•„์ดํ…œ 34์—์„œ ์„ค๋ช…ํ•œ ์—ด๊ฑฐ ํƒ€์ž…์˜ ์žฅ์ ๊นŒ์ง€ ์„ ์‚ฌํ•œ๋‹ค. 
๋‹จ์  
- ๋ถˆ๋ณ€ EnumSet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. Collections.unmodifiableSet์œผ๋กœ EnumSet์„ ๊ฐ์‹ธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
โš ๏ธ **GitHub.com Fallback** โš ๏ธ