Bibi's DevLog ๐Ÿค“๐ŸŽ

[Java] enum (์—ด๊ฑฐํ˜•) ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Java ์ž๋ฐ”

[Java] enum (์—ด๊ฑฐํ˜•)

๋น„๋น„ bibi 2021. 2. 18. 23:50

์ž๋ฐ” enum

์ด ๊ธ€์€ '์ž๋ฐ”์˜ ์ •์„' ๋ฐ ๊ตฌ๊ธ€๋ง, ์ˆ˜์—… ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

enum (์—ด๊ฑฐํ˜•) ์ด๋ž€?

: ์„œ๋กœ ์—ฐ๊ด€๋œ ์—ฌ๋Ÿฌ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•(ํด๋ž˜์Šค).

  • java.lang.Enumํด๋ž˜์Šค๊ฐ€ ๋ชจ๋“  enum์˜ ์กฐ์ƒ ํด๋ž˜์Šค์ด๋‹ค.

  • ์ƒ์ˆ˜๋“ค์˜ ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž…๊นŒ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

enum์˜ ํŠน์ง•

  • enum์˜ ์ƒ์„ฑ์ž๋Š” ํ•ญ์ƒ private์ด๋‹ค. ์ฆ‰, enum์˜ ์ƒ์„ฑ์ž๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ private์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ enum ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹Œ JVM์ด ์ง์ ‘ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ.
      ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž๊ฐ€ ํ•ญ์ƒ private์ด๋‹ค.
  • enumํด๋ž˜์Šค์˜ enum์ƒ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ๋ณดํ†ต final์ด์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ™์€ enumํƒ€์ž…๋ผ๋ฆฌ๋งŒ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

enum ์„ ์–ธํ•˜๊ธฐ

  • enum enum๋ช… { ์ƒ์ˆ˜1์ด๋ฆ„, ์ƒ์ˆ˜2์ด๋ฆ„, ... } ์™€ ๊ฐ™์ด ์„ ์–ธํ•œ๋‹ค.

    • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์ˆ˜1์ด๋ฆ„์˜ ์ˆœ์„œ = 0, ์ƒ์ˆ˜2์ด๋ฆ„์˜ ์ˆœ์„œ = 1 .. ๋กœ ํ• ๋‹น๋œ๋‹ค.
  • enum enum๋ช… { ์ƒ์ˆ˜1์ด๋ฆ„(์ƒ์ˆ˜1๊ฐ’), ์ƒ์ˆ˜2์ด๋ฆ„(์ƒ์ˆ˜2๊ฐ’) ... ; } ์ฒ˜๋Ÿผ enum์ƒ์ˆ˜์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๊ฐ’์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์ƒ์ˆ˜์— ;๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.
  • enum enum๋ช… { ์ƒ์ˆ˜1์ด๋ฆ„(์ƒ์ˆ˜1๊ฐ’1, ์ƒ์ˆ˜1๊ฐ’2), ์ƒ์ˆ˜2์ด๋ฆ„(์ƒ์ˆ˜2๊ฐ’1, ์ƒ์ˆ˜2๊ฐ’2) ... ; } ์ฒ˜๋Ÿผ enum์ƒ์ˆ˜์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    • ๊ฐ’1, ๊ฐ’2 ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ enum ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์™€ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

      โ€ป enum์ƒ์ˆ˜๋“ค์„ ๋ชจ๋‘ ์ •์˜ํ•œ ๋‹ค์Œ์— ๋‹ค๋ฅธ ๋ฉค๋ฒ„๋“ค์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์€ ํฌ๋งท์œผ๋กœ enumํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

public enum Color { // enumํด๋ž˜์Šค ์„ ์–ธ
    WHITE("white", 0), BLACK("black", 1); // enum์ƒ์ˆ˜์™€ ๊ฐ ์ƒ์ˆ˜๊ฐ’ ํ• ๋‹น

    private final String value; // enum์ƒ์ˆ˜๊ฐ’์„ ๋„ฃ๊ธฐ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜
    private final int index;

    Color(String color, int number) { // enum์ƒ์ˆ˜๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ƒ์„ฑ์ž
        this.value = color;
        this.index = number;
    }

    public String getValue() { // ์™ธ๋ถ€์—์„œ value๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” getter
        return value;
    }

    public int getIndex() {
        return index;
    }
}
  • ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ๋„ ๊ทธ enum์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด enumํด๋ž˜์Šค๋ฅผ ๋ฐ–์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ๋งŒ ๊ทธ enum์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด enumํด๋ž˜์Šค๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•œ๋‹ค.

enum ์‚ฌ์šฉํ•˜๊ธฐ

enum๋ช….์ƒ์ˆ˜๋ช… ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
(ํด๋ž˜์Šค์˜ static๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผํ•จ)

enum์˜ ์žฅ์ 

  • ์ž๋ฐ”์˜ ์—ด๊ฑฐํ˜•์€ Type-safeํ•˜๋‹ค.
    ์ฆ‰, ์‹ค์ œ ๊ฐ’์€ ๊ฐ™์•„๋„ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด ์ƒ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ, ๊ทธ ์ƒ์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ ๋ชจ๋“  ์†Œ์Šค๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค.
    ๋ฐ˜๋ฉด enum์œผ๋กœ ์„ ์–ธํ•œ ์ƒ์ˆ˜๋Š” enum๋งŒ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋ฉด ๋œ๋‹ค.

  • enum ์ƒ์ˆ˜ ๊ฐ„ ๋น„๊ต์— ==๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋”ฐ๋ผ์„œ equals()๋ณด๋‹ค ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • >. < ๋น„๊ต์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ compareTo()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • compareTo()
      : ๋‘ ๋น„๊ต๋Œ€์ƒ์ด ๊ฐ™์œผ๋ฉด 0, ์™ผ์ชฝ์ด ํฌ๋ฉด ์–‘์ˆ˜, ์™ผ์ชฝ์ด ์ž‘์œผ๋ฉด ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ.
      ๋‘ ๋Œ€์ƒ์˜ ์ฐจ์ด๋งŒํผ ์–‘์ˆ˜/์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ.
  • switch์กฐ๊ฑด์‹์— enum์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ด ๋•Œ enum๋ช….์ƒ์ˆ˜๋ช…์ด ์•„๋‹Œ ์ƒ์ˆ˜๋ช…๋งŒ ์ ๋Š”๋‹ค.
  • ์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ๋•Œ์— ๋น„ํ•ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

  • ์ƒ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค (์—ญํ• ๋ถ„๋ฆฌ)

java.lang.Enum์˜ ๋ฉ”์†Œ๋“œ

  • values() : enum์˜ ๋ชจ๋“  ์ƒ์ˆ˜๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•จ.
  • valueOf(String name) : name๊ณผ ์ผ์น˜ํ•˜๋Š” enum์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ.
  • valueOf(Class<T> enumType, String name) : ์ง€์ •ํ•œ enum์—์„œ name๊ณผ ์ผ์น˜ํ•˜๋Š” enum์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ.
  • name() : enum์ƒ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•จ.
  • ordinal() : enum์ƒ์ˆ˜๊ฐ€ ์ •์˜๋œ ์ˆœ์„œ๋ฅผ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•จ(0๋ถ€ํ„ฐ ์‹œ์ž‘).
    • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹๋‹ค. ํŠนํžˆ, ordinal()๊ฐ’์„ enum์ƒ์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹๋‹ค.

enum์˜ ๋‚ด๋ถ€๊ตฌ์กฐ

enum์˜ enum์ƒ์ˆ˜ ํ•˜๋‚˜ํ•˜๋‚˜๋Š” enum ๊ทธ ์ž์‹ ์˜ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

enum Fruit { APPLE, KIWI, GRAPE } ์ด ์ฝ”๋“œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ด๋‹ค.

class Fruit {
    static final Fruit APPLE = new Fruit("APPLE");
    static final Fruit KIWI = new Fruit("KIWI");
    static final Fruit GRAPE = new Fruit("GRAPE");
}

Fruitํด๋ž˜์Šค์˜ static final ์ƒ์ˆ˜๋“ค์˜ ๊ฐ’์€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด๊ณ , ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ==๋กœ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

enum ๊ธฐํƒ€ ์ง€์‹

  • DB์—์„œ enum์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” int๋˜๋Š” varchar๋กœ ์ €์žฅํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.
    (MySQL์˜ ๊ฒฝ์šฐ)enumํƒ€์ž…์ด ๋”ฐ๋กœ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์ฐธ๊ณ 
  • enum์€ ValueObject์— ํ•ด๋‹นํ•œ๋‹ค.