λ€μ΄κ°κΈ° μ μ
λ°±κΈ°μ λμ [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 μ λν΄μ μκ² λμλλ°, λΉμμλ μ κ΅³μ΄ μ΄λ¬ν ꡬν체λ₯Ό μ¨μΌ νλμ§ μμ§λ, μλ €κ³ λ νμ§ μμλ€.
μ¬μ©ν΄μΌ νλ μ΄μ λ λͺ¨λ₯Έ μ± κ·Έλ₯ μ½λ λ³΅μ¬ / λΆμ¬λ£κΈ°λ§ νλ κ³Όκ±°μ λλ₯Ό λ°μ±νλ©°, μ΄λ ν μ΄μ μ μλ―Έλ₯Ό κ°μ§κ³ μ½λλ₯Ό μμ±νλμ§ κΉμ΄ μκ°ν΄μΌκ² ꡬλ λλ μκ°μ΄μλ€. μμΌλ‘ λ κ³ κ΅°λΆν¬ν μ μκΈ°λ₯Ό!
μ°Έκ³ μλ£
'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 |