EnumπŸ™†β€β™‚οΈ

κΉ€λ―Όμ œΒ·2023λ…„ 11μ›” 1일
0
post-thumbnail
  • 보톡 μƒμˆ˜λŠ” static final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ μ΄λŠ” μ—¬λŸ¬ λ¬Έμ œμ μ„ μ•ΌκΈ°μ‹œν‚¨λ‹€κ³  ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ λ¬Έμ œμ λ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ Enum 클래슀λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

Enum Class

  • Enum은 "Enumeration"의 μ•½μžμ΄λ©° Enumeration은 μ—΄κ±°, λͺ©λ‘ λ“±μ˜ λœ»μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.
  • 정해진 λ°μ΄ν„°μ˜ λ¬ΆμŒμ„ Enum으둜 λ¬Άμ–΄μ£Όλ©΄ 보닀 ꡬ쑰적인 ν”„λ‘œκ·Έλž˜λ°μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—΄κ±° νƒ€μž…μ€ μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜ λ°μ΄ν„°λ“€μ˜ μ§‘ν•©μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ°°μ—΄μ²˜λŸΌ λ‚˜μ—΄ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μš°μ„  예λ₯Ό λ“€μ–΄ μ•Œμ•„λ΄…μ‹œλ‹€.
  • 일주일을 λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ week에 μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜λ₯Ό λ„£μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 상황이라고 μƒκ°ν•΄λ΄…μ‹œλ‹€.
public class Week {
    public static final String MONDAY = "MONDAY";
    public static final String SUNDAY = "SUNDAY";

    public static void main(String[] args) {
        String week ;
        week = MONDAY;
        week = SUNDAY;
        // week에 μ•Œλ§žμ€ 값듀이 듀어감

        week = "kimminje";
        // week와 μ „ν˜€ μƒκ΄€μ—†λŠ” 값이 듀어가도 ν”„λ‘œκ·Έλž¨μ€ μ•Œμ§€ λͺ»ν•¨
    }

}
  • μœ„μ™€ 같은 μ½”λ“œκ°€ ꡬ성될 κ²ƒμž…λ‹ˆλ‹€.
  • μœ„μ™€ 같이 weekλŠ” μƒμˆ˜λ₯Ό λ„£μ–΄μ„œ μ‚¬μš©ν•˜μ§€λ§Œ week와 μ „ν˜€ μƒκ΄€μ—†λŠ” 값이 듀어가도 ν”„λ‘œκ·Έλž¨μ€ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. 이와 같은 상황이 였면 μš°λ¦¬λŠ” week 값이 μš”μΌμ— ν•΄λ‹Ήν•˜λŠ” 값이 λ§žλŠ”μ§€ κ²€μ¦ν•˜λŠ” λ‘œμ§μ„ 또 κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 상황을 ν•΄κ²°ν•΄μ£ΌλŠ” 것이 enum ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • μ‰½κ²Œ 말해 초기적인 문제λ₯Ό λ°”λ‘œ μž‘κ² λ‹€!λΌλŠ” 것이 enum ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • enum ν΄λž˜μŠ€λŠ” μ•„λž˜μ™€ 같이 μ‚¬μš©λ©λ‹ˆλ‹€.
enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

public class TTest {
    public static void main(String[] args) {
        Week week ;
        week = Week.MONDAY;
        week = Week.SUNDAY;
        System.out.println(week);
        // week에 μ•Œλ§žμ€ 값듀이 듀어감

        week = "kimminje";
        // incompatible types μ—λŸ¬ λ°œμƒ
    }
}
  • μœ„μ™€ 같이 μ €ν¬μ—κ²Œ λ°œμƒν–ˆλ˜ 문제λ₯Ό ν•΄κ²°ν•΄μ£ΌλŠ” 것을 확인해볼 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 그럼 enum ν΄λž˜μŠ€μ— λŒ€ν•΄ 더 μžμ„Έν•˜κ²Œ μ•Œμ•„λ΄…μ‹œλ‹€!

Enum의 νŠΉμ§•

  • DB의 μ½”λ“œ κ°’κ³Ό 많이 ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • primitive(μ›μ‹œ) νƒ€μž…μ΄ μ•„λ‹ŒΒ referece(μ°Έμ‘°) νƒ€μž…μœΌλ‘œ λΆ„λ₯˜λ˜λ―€λ‘œ enum μƒμˆ˜κ°’μ€Β νž™ μ˜μ—­μ— μ €μž₯되게 λ©λ‹ˆλ‹€.
    • μœ„μ—μ„œ 예λ₯Ό λ“€λ©΄ MONDAY와 SUNDAYλΌλŠ” 객체가 νž™ μ˜μ—­μ— μƒμ„±λ˜κ³  monday와 sunday λ³€μˆ˜λŠ” 객체의 λ²ˆμ§€λ₯Ό μ°Έμ‘°ν•˜λŠ” 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
  • μœ„μ˜ μ˜ˆμ™€ 같이 μ‚¬μš©μžκ°€ μ˜¬λ°”λ₯Έ 값을 μ‚¬μš©ν–ˆλŠ”μ§€μ— λŒ€ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³ λ„ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • enum νƒ€μž… 객체도 ν•˜λ‚˜μ˜ 데이터 νƒ€μž…μ΄λ―€λ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum의 μž₯점

  • μ½”λ“œκ°€ λ‹¨μˆœν•΄μ§€λ©° 가독성이 μ’‹μ•„μ§‘λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ 생성과 상속을 λ°©μ§€ν•˜μ—¬ μƒμˆ˜μ˜ νƒ€μž… μ•ˆμ •μ„±(Type-Safety)κ°€ 보μž₯λ©λ‹ˆλ‹€.
  • κ΅¬ν˜„ μ˜λ„κ°€ μ—΄κ±°μž„μ„ ν™•μ‹€ν•˜κ²Œ μ•Œ 수 μžˆλ‹€.

Enum의 λ©”μ†Œλ“œ

  • λͺ¨λ“  Enum νƒ€μž…μ€ 컴파일 μ‹œμ— java.lang.Enum 클래슀λ₯Ό μƒμ†ν•˜κ²Œ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ—, java.lang.Enum 에 μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Enum은 λ‹€μŒκ³Ό 같은 λ©”μ†Œλ“œλ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.
λ©”μ†Œλ“œμ„€λͺ…리턴 νƒ€μž…
name()열거체 μƒμˆ˜μ˜ 이름을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.String
ordinal()ν•΄λ‹Ή 열거체 μƒμˆ˜μ˜ 열거체 순번(0λΆ€ν„° μ‹œμž‘)을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.int
compareTo()열거체 μƒμˆ˜λ“€μ„ λΉ„κ΅ν•˜μ—¬ 순번 차이λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.int
valueOf(String name)λ¬Έμžμ—΄μ„Β μž…λ ₯λ°›μ•„μ„œΒ μΌμΉ˜ν•˜λŠ”Β μ—΄κ±°μ²΄ μƒμˆ˜λ₯ΌΒ λ¦¬ν„΄ν•©λ‹ˆλ‹€.enum
values()λͺ¨λ“  μ—΄κ±° 객체듀을 enumλ°°μ—΄λ‘œ λ¦¬ν„΄ν•©λ‹ˆλ‹€.enum[]
  • 이 μ™Έμ˜ λ©”μ†Œλ“œλ₯Ό 더 보고싢닀면 μ—¬κΈ°λ‘œπŸ‘ˆπŸ‘ˆ

Enum 맀핑

  • λ˜ν•œ Enum의 μƒμˆ˜λ₯Ό 가져왔을 λ•Œ μƒμˆ˜μ˜ κ³ μœ κ°’μ„ κ°€μ Έμ˜€κ³  μ‹ΆμœΌλ©΄ λ§€ν•‘ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
public enum Week {
    MONDAY("μ›”μš”μΌ"),
    TUESDAY("ν™”μš”μΌ"),
    WEDNESDAY("μˆ˜μš”μΌ"),
    THURSDAY("λͺ©μš”일"),
    FRIDAY("κΈˆμš”μΌ"),
    SATURDAY("ν† μš”μΌ"),
    SUNDAY("μ›”μš”μΌ");

    private String week;
    private Week(String week) {
        this.week = week;
    }

    public String getDay(){
        return week;
    }
}

public class Test {
    public static void main(String[] args) {
        Week week = Week.SUNDAY;
        System.out.println(week);
        System.out.println(week.getDay());
    }
}

//좜λ ₯
SUNDAY
μΌμš”μΌ
  • 이와 같이 μƒμˆ˜λ₯Ό (” ”)으둜 κ³ μœ κ°’μ„ μ£Όκ³  getter, setter λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ–΄μ£Όλ©΄ μœ„μ™€ 같이 μ‚¬μš©ν•  수 μžˆλ‹€.

λ°μ΄ν„°μ˜ κ·Έλ£Ήν™” 및 관리

  • λ˜ν•œ enumμ€Β λ°μ΄ν„°μ˜ κ·Έλ£Ήν™” 및 관리에 μš©μ΄ν•©λ‹ˆλ‹€.
  • 데이터듀을 enum을 ν†΅ν•΄Β ν•œ 클래슀 λ‚΄μ—μ„œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ λ°˜μ— λŒ€ν•œ 학생듀 λͺ…단을 닀룬닀고 ν•œλ‹€λ©΄, λ°˜λ„ λ‹€λ₯΄κ³  같은 λ°˜μ—μ„œ 학생듀도 λ‹€λ₯΄λ‹ˆ 반 ν΄λž˜μŠ€μ™€ 학생 클래슀λ₯Ό λ‚˜λˆ„μ–΄ 두 ν΄λž˜μŠ€κ°€ μ—°κ΄€λ˜κ²Œ μ½”λ“œλ₯Ό ꡬ성해야할 κ²ƒμž…λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ enum을 μ΄μš©ν•˜λ©΄ ν•œλˆˆμ— 보기 μ‰½κ²Œ ꡬ성이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 그리고 μ μ ˆν•œ λ©”μ†Œλ“œ λ‘œμ§μ„ enum 객체 λ‚΄ μ•ˆμ— κ΅¬ν˜„ν•΄μ€€λ‹€λ©΄ κ°•λ ₯ν•œ μƒμˆ˜ 클래슀λ₯Ό κ΅¬ν˜„ν•  수 있게 λ©λ‹ˆλ‹€.
public enum Class {
    CLASSA("A반", Arrays.asList("kim", "min", "je")),
    CLASSB("B반", Arrays.asList("kim", "seoung", "hyun"));

    private final String Class;
    private final List<String> name;

    Week(String Class, List<String> name) {
        this.Class = Class;
        this.name = name;
    }

    String getClass(String names) {
        return Arrays.stream(Class.values())
                .filter(classes -> classes.equals(names))
                .findFirst()
                .orElseThrow(Exception::new);
    }
}

Enum의 ν™•μž₯

  • enum 맀핑 κΈ°λŠ₯κ³Ό λžŒλ‹€λ₯Ό ν™œμš©ν•˜μ—¬ μƒνƒœμ™€ ν–‰μœ„λ₯Ό ν•œ κ³³μ—μ„œ 관리가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 이λ₯Ό μ΄μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 κ°„λ‹¨ν•œ 사칙연산 λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μž„ν¬νŠΈ
import java.util.function.DoubleBinaryOperator;

enum Operation {
    PLUS("+", (x, y) -> x + y),
    MINUS("-", (x, y) -> x - y),
    TIMES("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);

    private final DoubleBinaryOperator op; // λžŒλ‹€μ‹μ„ μ €μž₯ν•  ν•„λ“œ

    private final String symbol;

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    @Override
    public String toString() { return symbol; }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}
profile
λΈ”λ‘œκ·Έ μ΄μ „ν–ˆμŠ΅λ‹ˆλ‹€!! πŸ‘‰ https://alswp006.github.io/

0개의 λŒ“κΈ€