[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item01 μ™„λ²½κ³΅λž΅. μ—΄κ±°νƒ€μž… Enumeration

2023. 1. 3. 11:39ㆍJAVA/Effective JAVA

728x90

 

item01. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ. 

"p9. μ—΄κ±° νƒ€μž…μ€ μΈμŠ€ν„΄νŠΈκ°€ ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ§μ„ 보μž₯ν•œλ‹€."

 

 

μ—΄κ±° νƒ€μž…μ΄λž€? 

: μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜μ˜ 집합을 μ €μž₯ν•˜λŠ” μžλ£Œν˜•, μƒμˆ˜ λͺ©λ‘μ„ 담을 수 μžˆλŠ” 데이터 νƒ€μž… 

ν•œμ •λœ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μžλ£Œν˜•μœΌλ‘œ 값을 μ œν•œν•  수 μžˆλ‹€. 

 

μ—΄κ±° νƒ€μž…μ€ νŠΉμ •ν•œ λ³€μˆ˜κ°€ κ°€μ§ˆ 수 μžˆλŠ” 값을 μ œν•œ ν•  수 μžˆλ‹€. 

OrderStatusλΌλŠ” Enum 에 PREPARRING, SHIPPED, DELIVERING, DELIVERED μ΄λ ‡κ²Œ 값을 μ •ν–ˆλ‹€λ©΄ 

 

 Orderμ—μ„œ OrderStatus 값을 4가지 μƒνƒœ κ°’ 말고 λ‹€λ₯Έ 값을 μž…λ ₯ν•  수 없도둝 값을 μ œν•œν•  수 μžˆλ‹€. 

 

μ—΄κ±°νƒ€μž…μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³ , κΈ°λ³Έ μžλ£Œν˜•μœΌλ‘œ μ΄λ ‡κ²Œ 지정해주면 200 λ“± λ‹€λ₯Έ 값이 λ“€μ–΄κ°ˆ 수 있기 λ•Œλ¬Έμ— Enum을 μ‚¬μš©ν•˜λŠ”κ±Έ ꢌμž₯ν•œλ‹€. 

 

* μ—΄κ±°νƒ€μž…μ€ 동일 JVMλ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ§μ„ 보μž₯ν•˜κΈ° λ•Œλ¬Έμ— 싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€. 

 

 

 

Enum은 μžλ°”μ˜ 클래슀처럼 μƒμ„±μž, λ©”μ†Œλ“œ, ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μžˆλŠ”κ°€?

Enum은 사싀 클래슀이기 λ•Œλ¬Έμ— μƒμ„±μžλ₯Ό κ°€μ§ˆμˆ˜λ„ 있고, λ©”μ„œλ“œλ₯Ό 생성할 μˆ˜λ„ 있으며, ν•„λ“œλ₯Ό κ°€μ§ˆμˆ˜λ„ μžˆλ‹€. 

 

 

 

Enum이 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ 

valueOf() 

:  맀개 κ°’μœΌλ‘œ μ£Όμ–΄μ§€λŠ” λ¬Έμžμ—΄κ³Ό λ™μΌν•œ λ¬Έμžμ—΄μ„ κ°€μ§€λŠ” μ—΄κ±° 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 

-> 이 λ©”μ„œλ“œλŠ” μ™ΈλΆ€λ‘œλΆ€ν„° λ¬Έμžμ—΄μ„ μž…λ ₯λ°›μ•„ μ—΄κ±° 객체둜 λ³€ν™˜ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

values()

: μ—΄κ±° νƒ€μž…μ˜ λͺ¨λ“  μ—΄κ±° 객체듀을 λ°°μ—΄λ‘œ λ§Œλ“€μ–΄ λ¦¬ν„΄ν•œλ‹€. 

 

name() 

: μ—΄κ±° 객체가 가지고 μžˆλŠ” λ¬Έμžμ—΄μ„ λ¦¬ν„΄ν•˜λŠ” λ©”μ„œλ“œ.

 

ordinal() 

: 전체 μ—΄κ±° 객체 쀑 λͺ‡λ²ˆμ§Έ μ—΄κ±° 객체인지 μ•Œλ €μ£ΌλŠ” λ©”μ„œλ“œ (0λ²ˆλΆ€ν„° μ‹œμž‘) 

 

 

 

enum의 값은 == μ—°μ‚°μžλ‘œ 동일성을 비ꡐ할 수 μžˆλŠ”κ°€?

: Yes 

Enum 값은 ==μ—°μ‚°μž μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€. 

μ™œλƒν•˜λ©΄ equals()λ₯Ό μ‚¬μš©ν•˜λ©΄ enum의 값이 null 이면 NPEκ°€ λ°œμƒν•˜λŠ”λ° == μ—°μ‚°μžλŠ” NULL이면 κ·Έλƒ₯ 같지 μ•Šλ‹€λ‘œ NPE λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 

 

 

 

EnumSet

: EnumSet은 enum 클래슀둜 μž‘λ™ν•˜κΈ° μœ„ν•΄ νŠΉν™”λœ Set μ»¬λ ‰μ…˜μ΄λ‹€. 

EnumSet은 μ—΄κ±°ν˜• κ°’λ§Œ 포함할 수 있고, λͺ¨λ“  값은 λ™μΌν•œ μ—΄κ±°νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€. 

 

allOf()  : λͺ¨λ“  μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” EnumSet λ§Œλ“€ 수 μžˆλ‹€. 

of() : λ“€μ–΄κ°ˆ μš”μ†Œλ₯Ό 직접 μž…λ ₯ν•˜μ—¬ EnumSet λ§Œλ“€ 수 μžˆλ‹€. 

 

noneOf() : 빈 EnumSet을 λ§Œλ“€ 수 μžˆλ‹€. 

 

add() : EnumSet에 μš”μ†Œ μΆ”κ°€ν•  수 μžˆλ‹€. 

 

contains() : νŠΉμ • μš”μ†Œκ°€ EnumSet에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€. 

 

remove() : νŠΉμ • μš”μ†Œλ₯Ό EnumSetμ—μ„œ μ œκ±°ν•  수 μžˆλ‹€. 

 

EnumSet μž₯점 

: EnumSet의 λͺ¨λ“  λ©”μ„œλ“œλ“€μ€ μ‚°μˆ  λΉ„νŠΈ 연산을 μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„λ˜κΈ° λ•Œλ¬Έμ— 일반적인 연산이 맀우 λΉ λ₯ΈνŽΈμ΄λ‹€. 

EnumSet은 HashSetκ³Ό 같은 Set κ΅¬ν˜„μ²΄μ™€ λΉ„κ΅ν–ˆμ„ λ•Œ, 데이터가 μ˜ˆμƒ κ°€λŠ₯ν•œ μˆœμ„œλŒ€λ‘œ μ €μž₯λ˜μ–΄ 있고, 

각 계산을 ν•˜λŠ”λ° ν•˜λ‚˜μ˜ λΉ„νŠΈλ§Œ ν•„μš”ν•˜λ―€λ‘œ 더 λΉ λ₯΄λ‹€κ³  ν•  수 μžˆλ‹€. 

λ˜ν•œ HashSet의 κ²½μš°μ—λŠ” 데이터λ₯Ό μ €μž₯ν•  버킷을 μ°ΎκΈ°μœ„ν•΄ Hashcode 값을 κ³„μ‚°ν•˜λŠ”λ° EnumSet은 그런 계산 과정이 ν•„μš” μ—†μ–΄ 맀우 λΉ λ₯ΈνŽΈμ΄λ‹€. 

 

 

 

EnumMap

: Map μΈν„°νŽ˜μ΄μŠ€μ—μ„œ ν‚€λ₯Ό νŠΉμ • Enum νƒ€μž…λ§Œμ„ μ‚¬μš©ν•˜λ„λ‘ ν•˜λŠ” κ΅¬ν˜„μ²΄μ΄λ‹€. 

 

EnumMap은 Enum μƒμˆ˜λ‘œ 이루어진 μˆœμ„œμ— κΈ°λ°˜μ„ 두고 μžˆλŠ” λ°˜λ©΄μ— HashMap 은 Hash Table을 기반으둜 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. 

Enum은 ordinalμ΄λΌλŠ” 순차적인 μ •μˆ˜κ°’μ„ 가지고 있고, EnumMap은 내뢀에 데이터λ₯Ό Array에 μ €μž₯ν•œλ‹€. 

λ”°λΌμ„œ HashMap 처럼 ν•΄μ‹œλ₯Ό λ§Œλ“€κ³  ν•΄μ‹œ μΆ©λŒμ— λŒ€μ‘ν•˜λŠ” μž‘μ—… μžμ²΄κ°€ ν•„μš” μ—†μ–΄ EnumMap이 HashMap에 λΉ„ν•΄ μ„±λŠ₯이 μ’‹λ‹€.  

 

 EnumMap을 생성할 λ•Œμ—λŠ” ν‚€λ‘œ μ“°λŠ” enum νƒ€μž…μ„ 인자둜 λ„˜κ²¨μ€˜μ•Ό ν•œλ‹€. 

 

 

EnumMap μž₯점

: EnumMap은 값을 찾을 λ•Œ enum μƒμˆ˜κ°€ index 정보λ₯Ό ordinal λ©”μ†Œλ“œλ‘œ μ œκ³΅ν•˜κ³  있기 λ•Œλ¬Έμ— λ°”λ‘œ 찾을 수 μžˆμ§€λ§Œ, HashMap은 찾을 λ•Œ key 값을 hash λ©”μ†Œλ“œλ‘œ index둜 λ³€ν™˜ν•˜κ³  μ°Ύμ•„μ•Όν•œλ‹€.  

그리고 값을 넣을 λ•Œλ„  EnumMap은 key의 index μ •λ³΄λ‘œ 값이 μ €μž₯된 μœ„μΉ˜λ₯Ό μ°Ύμ•„μ„œ λ°”λ‘œ 값을 λ„£λŠ” 반면, HashMap은 key 값을 hash둜 λ§Œλ“€κ³ , λ°°μ—΄μ˜ 크기λ₯Ό μ‘°μ ˆν•˜λŠ” λ“±μ˜ 일이 μΆ”κ°€λ‘œ ν•„μš”ν•˜λ‹€. 

λ”°λΌμ„œ λ°°μ—΄μ˜ 크기가 κ³ μ •λ˜μ–΄ 있고, λ°”λ‘œ 찾을 수 μžˆλŠ” EnumMap 이 μ„±λŠ₯상 더 νš¨μœ¨μ μ΄λ‹€. 

 

 

 

 

 

 

 

 

 

 

 

728x90