Week11(Enum)

Enumμ΄λž€?

  • 열거체라고 ν•΄μ„œ enumeration type이닀.

  • 클래슀처럼 보이게 ν•˜λŠ” μƒμˆ˜

    • μƒμˆ˜μ΄κΈ° λ•Œλ¬Έμ— equalsν•¨μˆ˜κ°€ μ•„λ‹Œ '=='둜 비ꡐ가 κ°€λŠ₯ν•˜λ‹€!!

  • μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ„ λͺ¨μ•„ μ‹¬λ³Όλ¦­ν•œ λͺ…μΉ­μ˜ μ§‘ν•©μœΌλ‘œ μ •μ˜ν•œ 것

  • Enum ν΄λž˜μŠ€ν˜•μ„ 기반으둜 ν•œ ν΄λž˜μŠ€ν˜• μ„ μ–Έ

  • μƒˆλ‘œμš΄ μ—΄κ±°ν˜•μ„ μ„ μ–Έν•˜λ©΄, λ‚΄λΆ€μ μœΌλ‘œ Enum ν΄λž˜μŠ€ν˜• 기반의 μƒˆλ‘œμš΄ ν΄λž˜μŠ€ν˜•μ΄ λ§Œλ“€μ–΄μ§

μž₯점

  • λ¬Έμžμ—΄κ³Ό λΉ„κ΅ν•΄μ„œ μžλ™μ™„μ„±, μ˜€νƒ€κ²€μ¦, ν…μŠ€νŠΈ λ¦¬νŒ©ν† λ§ λ“± μ—¬λŸ¬κ°€μ§€ 지원을 λ°›λŠ” 것이 κ°€λŠ₯

  • ν—ˆμš© κ°€λŠ₯ν•œ 값듀을 μ œν•œν•  수 있음

  • 열거체λ₯Ό 비ꡐ할 λ–„ μ‹€μ œ κ°’λΏλ§Œ μ•„λ‹ˆλΌ νƒ€μž…κΉŒμ§€λ„ 체크

  • μ—΄κ±°μ²΄μ˜ μƒμˆ«κ°’μ΄ μž¬μ •μ˜λ˜λ”λΌλ„ λ‹€μ‹œ 컴파일 ν•  ν•„μš”κ°€ μ—†μŒ

Enum의 λ©”λͺ¨λ¦¬ ν• λ‹Ή

Javaμ—μ„œ enum(μ—΄κ±° μƒμˆ˜)λŠ” μ„ μ–Έν•˜κ²Œ 되면 λͺ¨λ‘λ₯Ό public static final둜 μƒμ„±ν•˜κ²Œ λœλ‹€. μ—¬κΈ°μ„œ Staticμ΄λž€ ν‚€μ›Œλ“œκ°€ λΆ™κΈ° λ•Œλ¬Έμ— static이 뢙은 것듀은 jvmμ—μ„œμ˜ methodμ˜μ—­μ— ν• λ‹Ήλ˜κ²Œ 되고 ν”„λ‘œκ·Έλž¨μ΄ λ„λŠ” λ™μ•ˆμ—λŠ” μ›ν•˜λŠ” λŒ€λ‘œ κΊΌλ‚΄μ„œ μ‚¬μš©ν•  수 있게 λœλ‹€.

enum은 객체λ₯Ό μƒμ„±ν•˜λŠ” 것과 λΉ„μŠ·ν•˜μ§€λ§Œ, λ”°λ‘œ new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 객체λ₯Ό λ§Œλ“€μ§€λŠ” μ•ŠλŠ”λ‹€.

enumνƒ€μž…μ„ κ°€μ§„ 객체λ₯Ό λ§Œλ“€κ²Œ λœλ‹€λ©΄,

κ·Έ μˆœκ°„ jvm의 heap μ˜μ—­μ— λͺ¨λ“  enumνƒ€μž…μ΄ μƒμ„±λ˜κ²Œ λœλ‹€. (heapμ˜μ—­μ΄λž€ newν‚€μ›Œλ“œ 등을 톡해 μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ 객체듀이 λ“€μ–΄κ°€λŠ” μ˜μ—­μ΄λ‹€)

그리고 method μ˜μ—­μ— μƒμ„±λœ enum에 heapμ˜μ—­μ— μƒμ„±λœ 객체듀이 ν• λ‹Ήλœλ‹€.

κ·Έλ ‡κ²Œλœλ‹€λ©΄, μ‹€μ œλ‘œ 객체둜써 μ‚¬μš©λ˜λŠ” λ³€μˆ˜λŠ” stack에 λ“€μ–΄κ°€κ²Œ λ˜λŠ”λ° stackμ—μ„œ method에 μžˆλŠ” 객체의 μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  였기 λ•Œλ¬Έμ— 그러면 method와 heap λ‘˜λ‹€ λͺ¨λ‘ 같은 heapμ˜μ—­μ˜ μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  있게 λœλ‹€!

Enum을 μ •μ˜ν•˜λŠ” 방법

주의 : enum μ—΄κ±°ν˜•μœΌλ‘œ μ§€μ •λœ μƒμˆ˜λŠ” λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜λ©°, λ§ˆμ§€λ§‰μ— ; 을 λΆ™νžˆμ§€ μ•ŠλŠ”λ‹€!

  1. ν•˜λ‚˜μ˜ μžλ°” 파일둜 λ§Œλ“€μ–΄μ„œ μ„ μ–Έ

파일 생성할 λ–„ enum파일 μ„ νƒν•˜κ²Œλ˜λ©΄ μ›λž˜μ˜ class μžλ¦¬μ— enum이 듀어감

μ‚¬μš©ν•  λ•ŒλŠ”

Enum으둜 μ •μ˜ν•  λ•Œ μ‚¬μš©ν•œ 이름(subject) 을 Stringμ΄λ‚˜ int와 같은 νƒ€μž…μœΌλ‘œ 두고 μ‚¬μš©

  1. 클래슀 μ•ˆμ—μ„œ μ„ μ–Έν•˜κΈ°

ν•„μš”ν• λ•Œ enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ›ν•˜λŠ” μš”μ†Œλ“€μ„ μ§‘μ–΄λ„£μ–΄μ£Όκ³  μ‚¬μš©

  1. 클래슀 λ°–μ—μ„œ μ„ μ–Έν•˜κΈ°

선언을 ν•˜κ³  λ‚˜μ„œ μ‚¬μš©μ€ μ΄λ ‡κ²Œ ν•œλ‹€

데이터 νƒ€μž…μ²˜λŸΌ μ„ μ–Έν•˜κ³ , enum이름.enumμš”μ†Œ λ°©μ‹μœΌλ‘œ λ„£μ–΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€

enum이 μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œ

  • values() : λͺ¨λ“  enum의 μš”μ†Œλ“€μ„ λ°°μ—΄μœΌλ‘œ 생성

    • valuesν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ enum의 μš”μ†Œλ“€μ„ λͺ¨λ‘ 좜λ ₯ν•˜λŠ” μ˜ˆμ‹œ

  • valueOf() : λ¬Έμžμ—΄λ‘œ enum μš”μ†Œμ˜ 이름을 μ°Ύμ•„μ„œ μš”μ†Œμ˜ 이름을 리턴

  • name() : 호좜된 κ°’μ˜ 이름을 String으둜 리턴

  • ordinal() : ν•΄λ‹Ή 값이 enum이 μ •μ˜λœ μˆœμ„œλ₯Ό μ •μˆ˜κ°’μœΌλ‘œ 리턴

    • 이것은 μ–Έμ œ λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ‚¬μš©ν•  μˆ˜λ„ 있기 떄문에 μ‚¬μš©μ„ 덜 ν•œλ‹€

    • (심지어 μ°Ύμ•„λ³΄λ‹ˆκΉŒ Most programmer듀은 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ£Όμ„μœΌλ‘œλ„ μ ν˜€μžˆμ—ˆλ‹€!)

  • compareTo(E o ) : enumκ³Ό μ§€μ •λœ 객체의 μˆœμ„œλ₯Ό 비ꡐ, μ§€μ •λœ 객체보닀 μž‘μ€ 경우, 음의 μ •μˆ˜, λ™μΌν•˜λ©΄ 0, 크면 μ–‘μ˜ μ •μˆ˜ 리턴

  • equals(Object other) : μ§€μ •λœ 객체가 enum μ •μˆ˜μ™€ κ°™μ€κ²½μš°, trueλ₯Ό 리턴

java.lang.Enum

Enum ν΄λž˜μŠ€λŠ” λͺ¨λ“  μžλ°” μ—΄κ±°μ²΄μ˜ κ³΅ν†΅λœ 쑰상 클래슀

Enum ν΄λž˜μŠ€μ—λŠ” 열거체λ₯Ό μ‘°μž‘ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ†Œλ“œκ°€ 있음

μœ μΌν•œ μƒμ„±μž

protected Enum(String name, int ordinal) : μœ μΌν•œ μƒμ„±μžλ‘œ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 이 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μ—†μŒ

μ—΄κ±°ν˜• 선언에 λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μ»΄νŒŒμΌλŸ¬μ—μ„œ 내보낸 μ½”λ“œλ₯Ό μ‚¬μš©

EnumSet

java.util에 μ‘΄μž¬ν•˜λ©°, class EnumSet>μ΄λ ‡κ²Œ μ„ μ–Έν•˜λ©΄μ„œ μ‚¬μš©ν•œλ‹€

EnumSet은 μ—΄κ±°ν˜• μœ ν˜•κ³Ό ν•¨κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ setκ΅¬ν˜„μ²΄μ΄λ‹€.

λ°˜λ³΅ν•˜λŠ” λ©”μ†Œλ“œμ— μ˜ν•΄ λ¦¬ν„΄λœ λ°˜λ³΅κΈ°λŠ” μ—΄κ±° ν˜• μƒμˆ˜κ°€ μ„ μ–Έλœ μˆœμ„œλ‘œ μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©°, λ¦¬ν„΄λœ λ°˜λ³΅κΈ°λŠ” μ•½ν•˜κ²Œ 일관성이 있음

Null μš”μ†ŒλŠ” ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ©° λ§Œμ•½ null μš”μ†Œλ₯Ό μ‚½μž…ν•˜λ €κ³  ν•˜λ©΄ NullPointerException이 λ°œμƒν•œλ‹€. κ·ΈλŸ¬λ‚˜ nullμš”μ†Œκ°€ μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” λ‹¨κ³„λ‚˜ μ œκ±°ν•˜λ €λŠ” μ‹œλ„λŠ” κ°€λŠ₯ν•˜λ‹€

EnumSet은 λ™κΈ°ν™”λ˜μ§€ μ•ŠλŠ”λ‹€. μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ—΄κ±°ν˜• 집합에 μ ‘κ·Όν•˜κ³  적어도 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ 집합을 μˆ˜μ •ν•˜λŠ” κ²½μš°μ— μ™ΈλΆ€μ—μ„œ λ™κΈ°ν™”λ˜μ–΄μ•Ό ν•œλ‹€.

λ©”μ†Œλ“œλ“€

  • allOf : μ§€μ •λœ μš”μ†Œ νƒ€μž…μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” enum set을 λ§Œλ“¬

  • noneOf : μ§€μ •λœ μš”μ†Œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 빈 enum set을 λ§Œλ“¬

Type Safety

tip) 값을 λ§€κΈ°κ³  μˆœμ„œλ₯Ό μ •ν• λ•ŒλŠ” 1,2,3... μ΄λ ‡κ²Œ κ°€λŠ”κ²Œμ•„λ‹ˆλΌ 10,20,30 μ΄λ ‡κ²Œ μˆœμ„œλ₯Ό λ§€κΈ°λ©΄ νŽΈν•˜λ‹€! => 사이에 값을 μΆ”κ°€ν•  일이 생길것이기 λ•Œλ¬Έμ—!

μ°Έκ³ 

https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html

https://www.opentutorials.org/module/1226/8025

https://limkydev.tistory.com/66

https://parkadd.tistory.com/50

Last updated

Was this helpful?