item 36 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- ์ด๊ฑฐํ ๊ฐ๋ค์ด ์ฃผ๋ก ์งํฉ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์์ ์๋ ๊ฐ ์์์ ์๋ก ๋ค๋ฅธ 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));
}
}
- applyStyles ๋ฉ์๋๊ฐ EnumSet<Style>์ด ์๋ Set<Style>์ ๋ฐ์ ์ด์ ๋ฅผ ์๊ฐํด๋ณด์.
- ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ EnumSet์ ๊ฑด๋ค๋ฆฌ๋ผ ์ง์๋๋ ์ํฉ์ด๋ผ๋ ์ด์์ด๋ฉด ์ธํฐํ์ด์ค๋ก ๋ฐ๋๊ฒ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ต๊ด์ด๋ค. (์์ดํ 64)
- ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ Set ๊ตฌํ์ฒด๋ฅผ ๋๊ธฐ๋๋ผ๋ ์ฒ๋ฆฌํ ์ ์๋ค.
ํต์ฌ ์ ๋ฆฌ
์ด๊ฑฐํ ์ ์๋ ํ์
์ ํ๋ฐ ๋ชจ์ ์งํฉ ํํ๋ก ์ฌ์ฉํ๋ค๊ณ ํด๋ ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ์๋ค.
EnumSet ํด๋์ค๊ฐ ๋นํธ ํ๋ ์์ค์ ๋ช
๋ฃํจ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ๊ณ ์์ดํ
34์์ ์ค๋ช
ํ ์ด๊ฑฐ ํ์
์ ์ฅ์ ๊น์ง ์ ์ฌํ๋ค.
๋จ์
- ๋ถ๋ณ EnumSet์ ์ฌ์ฉํ ์ ์๋ค. Collections.unmodifiableSet์ผ๋ก EnumSet์ ๊ฐ์ธ ์ฌ์ฉํ ์ ์๋ค.