λ€μ΄κ°κΈ° μ μ
λ°±κΈ°μ λμ [Effective Java] κ°μλ₯Ό μκ°νλ μ€ μ¬λ¬ κ°μ Enum κ°μ²΄λ₯Ό κ°μ§κ±°λ Enum κ°μ²΄λ₯Ό Key λ‘ κ°μ§λ κ²½μ° μ EnumMap μ΄λ EnumSet μ μ°λ κ²μ΄ λ€λ₯Έ Map / Set ꡬν체λ₯Ό μ¬μ©νλ κ²λ³΄λ€ ν¨μ¨μ μΈμ§μ λν΄ νμ΅νλ κ³Όμ λ₯Ό λ°μλ€. μ΄λ² μκ°μλ μ΄λ€μ΄ λμνλ λ°©μκ³Ό κ·Έμ λν μ°¨μ΄μ λ° μ»μ μ μλ μ΄μ μ λν΄μ μ΄ν΄λ³΄λ €κ³ νλ€.
μ μ΄κ±° νμ μ μ¬μ©ν΄μΌ ν κΉ?
Java 1.5 λ²μ μ΄μ μλ μμ£Ό μ¬μ©νλ μμλ₯Ό int νμ μΌλ‘ μ μνμ¬ μ¬μ©νλ€. μ΄λ₯Ό μ μ μ΄κ±° ν¨ν΄μ΄λΌκ³ νλ€. κ³Όκ±°μ λ°©μμ²λΌ int λ₯Ό μ΄μ©ν΄ μμλ₯Ό μ΄κ±°νλ κ²½μ° λ€μκ³Ό κ°μ λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€.
1. μ»΄νμΌ νμμμ νμ
μμ μ±μ 보μ₯ν μ μλ€.
2. Name Space λ₯Ό κ°μ§ μ μκΈ° λλ¬Έμ λμΌν μ΄λ¦μ λν΄μ μ λμ¬λ₯Ό μΆκ°ν΄ νΌλμ νΌν΄μΌ νλ©°, κ°λ
μ±μ λ¨μ΄νΈλ¦°λ€.
3. μλ―Έκ° μλ‘ λ€λ₯Έ μμλΌλ λλ± λΉκ΅ μ°μ° μ, ν΄λΉ μμμ μ μκ°μ΄ κ°μ κ²½μ° True λ₯Ό λ°ννκ³ μ»΄νμΌλ¬λ μλ¬΄λ° κ²½κ³ λ©μΈμ§λ₯Ό μΆλ ₯νμ§ μμ κ°λ°μκ° λΆμ¬ν μλ―Έ, μλμλ λ€λ₯΄κ² μλν μ μλ€.
μ΄λ¬ν μ μ μ΄κ±° ν¨ν΄μ λ¨μ μ Java 1.5 λΆν° λ±μ₯ν Enum μ μ΄μ©νλ©΄ ν΄κ²°ν μ μλ€.
C, CPP λ±κ³Ό κ°μ μΈμ΄μ λΉμ·νμ§λ§ μ΅μ’
μ μΌλ‘λ μ°Έμ‘° νμ
(νλμ ν΄λμ€) μ΄κΈ° λλ¬Έμ ν¨μ¬ λ κ°λ ₯νλ€. Enum μ κ° μν μ λ§λ λ©€λ² μμ±μ μΆκ°νκ±°λ μν μ λ§λ λ©μλλ₯Ό μ μν΄ μ΄κ±° νμ
λ³λ‘ λΆμ¬λ κ·Έ μλ―Έμ λν μ±
μμ μ¨μ ν λ€ν μ μλ€.
Java μ Enum μ μμ νλλΉ μμ μ μΈμ€ν΄μ€λ₯Ό νλμ© λ§λ€μ΄ public static final
νλλ‘ κ³΅κ°νκ³ , μΈλΆμμ μ κ·Όν μ μλ μμ±μλ₯Ό μ 곡νμ§ μκΈ° λλ¬Έμ μ¬μ€μ final
μ μλ―Έλ₯Ό κ°μ§λ€. μ¦, JVM μμμ Enum μ λ¨ νλλ§ μ‘΄μ¬νλ κ²μ΄λ€. κ·Έλ κΈ° λλ¬Έμ Singleton ν¨ν΄μ μμκ° νλμΈ μ΄κ±° νμ
μ΄λΌκ³ ν μ μμΌλ©°, νΉμ μ΄κ±° νμ
μ Singleton μ μΌλ°νν ννλΌκ³ ν μ μλ€.
λν, Enum μ μμ λ§ν κ²κ³Ό κ°μ΄ νλμ ν΄λμ€μ΄κΈ° λλ¬Έμ μ»΄νμΌνμ νμ
μμ μ±μ μ 곡νλ€.
λλ¬Έμ κΈ°μ‘΄μ μ μ μ΄κ±° ν¨ν΄μ μ΄μ©νλ©΄ μ»΄νμΌνμμμ 체ν¬νμ§ λͺ»ν΄ λ€λ₯Έ μλ―Έμ μμλλΌλ κ·Έλλ‘ κ°μ΄ λ°νλμλ€λ©΄, Enum μ μ ν΄μ§ EnumType λ§ λ°νν μ μκΈ°μ λ€λ₯Έ νμ
μ Enum μ λκΈ°λ €κ³ νλ κ²½μ° μ»΄νμΌ μλ¬κ° λ°μνλ€.
μ EnumSet κ³Ό EnumMap μ μ¬μ©ν΄μΌ ν κΉ?
EnumSet?
EnumSet μ universe λΌλ Enum λ°°μ΄μ λ©€λ² μμ±μΌλ‘ κ°μ§κ³ , universe μ length() λ°νκ°μ κΈ°μ€μΌλ‘ RegularEnumSet νΉμ JumboEnumSet μΌλ‘ λΆκΈ° μ²λ¦¬νμ¬ κ΅¬ν체λ₯Ό λ°ννλ€. μ κ΅³μ΄ universe μ length() λ₯Ό κΈ°μ€μΌλ‘, 64 λΌλ νΉμ μ μΈ κ°μ κΈ°μ€μΌλ‘ ν΄μ ꡬν체λ₯Ό λλμ΄ λ°ννλκ±ΈκΉ?
RegularEnumSet μ long μ bit λ²μλ₯Ό κΈ°μ€μΌλ‘ ννν μ μλ κ²½μ°μ μ¬μ©λκ³ , JumboEnumSet μ long μ bit λ²μλ₯Ό μ΄κ³Όνλ κ²½μ°μ μ¬μ©λλ€. κ·Έλμ RegularEnumSet κ³Ό JumboEnumSet μ elements λ©€λ² μμ±μ κ°κ° long κ³Ό long[] λ‘ λ€λ₯΄λ€.
μ΄ λ, EnumSet μ ꡬν체λ€μ μ long νμ
μ μ΄μ©νλκ±ΈκΉ?
μ΄λ λΉνΈ μ°μ°μ μ¬μ©νκΈ° μν¨μΌλ‘ Enum μ μμΉλ₯Ό λΉνΈλ‘ λνλμΌλ‘μ¨ ν΄λΉ λΉνΈ μμΉμ Enum μ μ‘΄μ¬ μ¬λΆλ₯Ό κ΅μ₯ν λΉ λ₯΄κ² νμ
ν μ μκΈ° λλ¬Έμ΄λ€. λ€λ§ universe λ‘ λ€μ΄μ¨ λ°μ΄ν°μ κ°μ(μ μ₯ν λ°μ΄ν°μ μ) κ° μλ ν΄λΉ Enum μ μ μλ μμμ κ°μλ₯Ό λ°νμΌλ‘ elements λ₯Ό κ³ λ €νλ€.
μμ κ°μ λ°©λ²μΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° λλ¬Έμ EnumSet μ μ°μ λΉνΈ μ°μ°μ μ΄μ©ν΄ ꡬνλμ΄ μλ€.
μ°μ λΉνΈ μ°μ°μ μΌμ μκ° λ΄μ μ€νλκΈ° λλ¬Έμ λ§€μ° λΉ λ₯΄κ² μ°μ°μ μ²λ¦¬ν μ μμΌλ©°, μ΄λ‘ μΈν΄ Set μ λ€λ₯Έ ꡬν체λ€κ³Ό λ¬λ¦¬ λ λΉ λ₯΄κ² λ°μ΄ν°μ μμΉλ₯Ό νμ
ν μ μμΌλ©° λ³λλ‘ hashCode λ₯Ό μ¬μ©νμ§ μμλ λλ μ₯μ μ΄ μλ€.
μ΄λ¬ν νΉμ§μΌλ‘ μΈν΄ EnumSet μ΄ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νλ λΉμ¨μ΄ μ μ΄ κ΅μ₯ν μμΆμ μ΄λ©΄μ ν¨μ¨μ μ΄κΈ° λλ¬Έμ μ¬λ¬ Enum λ°μ΄ν°λ₯Ό μ μ₯ν΄μΌ νλ κ²½μ°, Set μ ꡬν체λ₯Ό μ΄μ©νλ κ²λ³΄λ€ EnumSet μ μ΄μ©νλ κ²μ λ¨Όμ κ³ λ €ν΄μΌ νλ€.
EnumMap?
κ·Έλ λ€λ©΄ Enum μ Key λ‘ κ°μ§λ Map κ°μ²΄λ₯Ό κ³ λ €ν λ μ EnumMap ꡬν체λ₯Ό μ¬μ©νλ κ²μ΄ λ ν¨μ¨μ μΌκΉ?
κ·Έ μ΄μ λ λ°λ‘ EnumMap μ Key μ Value κ° λ°°μ΄λ‘ μ μλμ΄ μκΈ° λλ¬Έμ΄λ€.
HashMap ν΄λμ€λ₯Ό μ΄ν΄λ³΄λλΌλ HashMap μ EnumMap κ³Όλ λ¬λ¦¬ Node λΌλ Inner Class λ₯Ό ꡬννκ³ μ΄λ₯Ό λ©€λ² μμ±μΌλ‘ μ¬μ©νκ³ μλ€. μ΄λ κΆκ·Ήμ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ λ°μ μμ΄μ EnumMap μ΄ ν¨μ¬ μ 리νλ€.
λ°°μ΄μ λ©€λ² μμ±μΌλ‘ μ¬μ©νλ EnumMap μ κ²½μ° Enum λ΄λΆμ μ μλ μμμ κ°μλ§νΌ Key μ Value μ κΈΈμ΄λ₯Ό μ μνκΈ° λλ¬Έμ λ³λλ‘ κ°μ²΄μ ν¬κΈ°λ₯Ό 리μ¬μ΄μ§ ν νμκ° μμ§λ§(λ°°μ΄μ΄ μ μΈλλ©΄μ λ©λͺ¨λ¦¬μ ν λΉλλ ν¬κΈ°λ₯Ό μ ννλ€.), HashMap μ κ²½μ° μ΄κΈ°νλ κΈΈμ΄λ₯Ό μ΄κ³Όνλ κ²½μ° κ°μ²΄μ ν¬κΈ°λ₯Ό μ¬μ μ νλ©΄μ λ©λͺ¨λ¦¬ 리μμ€λ₯Ό λ§μ΄ μλͺ¨νκ² λλ€.
λν, HashMap μ κ° λ Έλλ§λ€ HashCode λ₯Ό λΆμ¬νμ¬ λ°μ΄ν°μ ν΄μ μΆ©λμ λ°©μ΄ν΄μΌ νμ§λ§, EnumMap μ Key κ° μ μ΄μ λ©λͺ¨λ¦¬ μμ νλλ§ μ‘΄μ¬νκΈ° λλ¬Έμ μ΄λ¬ν μμ μ μνν νμκ° μλ€.
μ΄λ¬ν μ±λ₯ μ μ΄μ λλ¬Έμ Key λ₯Ό Enum μΌλ‘ λ°λ κ²½μ° EnumMap ꡬν체λ₯Ό κΌ κ³ λ €νμ¬ νλ‘κ·Έλ¨μ μ€κ³νλ κ²μ΄ μ’λ€.
λ§λ¬΄λ¦¬νλ©°
μ 무 μ€μ @Converter λ₯Ό μ΄μ©ν΄ DB μμ κ°μ§κ³ μ€λ λ°μ΄ν°λ₯Ό EnumSet / EnumMap μΌλ‘ λ°μΈλ©νλ μμ μ΄ νμνκ² λλ©΄μ μ°μ°ν EnumSet / EnumMap μ λν΄μ μκ² λμλλ°, λΉμμλ μ κ΅³μ΄ μ΄λ¬ν ꡬν체λ₯Ό μ¨μΌ νλμ§ μμ§λ, μλ €κ³ λ νμ§ μμλ€.
μ¬μ©ν΄μΌ νλ μ΄μ λ λͺ¨λ₯Έ μ± κ·Έλ₯ μ½λ λ³΅μ¬ / λΆμ¬λ£κΈ°λ§ νλ κ³Όκ±°μ λλ₯Ό λ°μ±νλ©°, μ΄λ ν μ΄μ μ μλ―Έλ₯Ό κ°μ§κ³ μ½λλ₯Ό μμ±νλμ§ κΉμ΄ μκ°ν΄μΌκ² ꡬλ λλ μκ°μ΄μλ€. μμΌλ‘ λ κ³ κ΅°λΆν¬ν μ μκΈ°λ₯Ό!
μ°Έκ³ μλ£
Using Bit Flags and EnumSets in Java · Edd Mann
Using Bit Flags and EnumSets in Java 20 Dec 2013 Bit Flags Bit flags, commonly referred to as Bit fields are an efficient way of storing several related boolean values in a single primitive type. Internally represented in binary, you can decide on how larg
eddmann.com
[JAVA] EnumMap μ μ¬μ©ν©μλ€.
www.manty.co.kr
λ°±κΈ°μ λ μ¨λΌμΈ μ€ν°λ 11μ£Όμ°¨-Enum
enumμ λν΄μ μκ³ μλ κ²λ³΄λ€ μ’ λ κΉμ΄ μμλ΄ μλ€.
velog.io
Enum (Java SE 11 & JDK 11 )
docs.oracle.com
'Programming > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
F019 - Socket (0) | 2021.06.22 |
---|---|
F018 - Serializable (μ§λ ¬ν, μμ§λ ¬ν) (0) | 2021.06.16 |
F017 - Blocking, Non-Blocking / Synchronous, Asynchronous (2) | 2021.06.15 |
F016 - File, I/O, Stream (0) | 2021.06.14 |
F015 - Set (μμ± μ€) (0) | 2021.05.31 |