๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”ญComputer Science๐Ÿ”ญ/JAVA

[JAVA] Enum ํ™œ์šฉํ•ด๋ณด๊ธฐ

Enum์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ static final ์ƒ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ด๋Ÿฌํ•œ enum ํ™œ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

1. Enum

enum์€ ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ์ƒ์ˆ˜์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. enum์ด ๋‚˜์˜ค๊ธฐ ์ด์ „์—๋Š” ํด๋ž˜์Šค์˜ `private static`์ด๋‚˜ `interface`์˜ ์ƒ์ˆ˜๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์ˆ˜์ง‘ํ•ฉ์„ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

a. ๊ธฐ์กด ์ƒ์ˆ˜์˜ ๋ฌธ์ œ์ 

1. ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ์ˆ˜์ง‘ํ•ฉ์€ ๋น„๊ตํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

- ๊ธฐ์กด ์ƒ์ˆ˜์ง‘ํ•ฉ๋“ค์€ ํƒ€์ž…๋งŒ ๊ฐ™์œผ๋ฉด ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚˜์ค‘์— ๋Ÿฐํƒ€์ž„์—์„œ ์ด๋กœ ์ธํ•œ ์—๋Ÿฌ๋ฅผ ์žก๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

b. ์ •์˜๋ฐฉ๋ฒ•

public enum Day {
    MONDAY, TUESDAY;
}

class DayStatic {
    private final static DayStatic MONDAY = new DayStatic();
    private final static DayStatic TUESDAY = new DayStatic();
}

enum์œผ๋กœ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ์•„๋ž˜ DayStatic์ฒ˜๋Ÿผ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

c. enum ์ถ”๊ฐ€์†์„ฑ

enum์˜ ์ƒ์ˆ˜์— ์ถ”๊ฐ€ ์†์„ฑ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜์™€ ๊ด€๋ จ์žˆ๋Š” ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด enumํด๋ž˜์Šค์˜ ํ•„๋“œ์— ์ •์˜ํ•ด์ฃผ๊ณ  ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

d. enum ์žฅ์ 

1. ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง€๋ฉฐ ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.

2. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ ์ƒ์†์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

3. enum ์˜ˆ์•ฝ์–ด๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์˜ ์˜๋„๊ฐ€ ์—ด๊ฑฐ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

2. ์ผ๋ฐ˜์ƒ์ˆ˜์™€ enum๋น„๊ต

์œ„ ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ƒ์ˆ˜์™€ enum์œผ๋กœ ๋งŒ๋“  ์ƒ์ˆ˜์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ผ๋ฐ˜ static ์ƒ์ˆ˜๋Š” String๊ฐ’์œผ๋กœ ๋„˜์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์ค‘๊ฐ„์— ๋ฐ”๊ปด๋„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

enum์„ ํ™œ์šฉํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ •ํ•ด์ง„ ์ƒ์ˆ˜์ด์™ธ์˜ ๊ฐ’์€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„ฃ์œผ๋ ค๊ณ  ํ•ด๋„ ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ๋จผ์ € ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์„ ์ œ์ ์œผ๋กœ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. enum ํ™œ์šฉ

1. ๋ฐ์ดํ„ฐ๋“ค ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„ ํ‘œํ˜„

์ฝ”๋“œ ์ค‘์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด๋‚˜ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ’๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์•„์„œ enum์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ID_CERTIFICATION์„ ์„ค๋ช…์ธ '์‹ ๋ถ„์ฆ์ธ์ฆ'๊ณผ ์ฝ”๋“œ๊ฐ’์ธ 'I'์™€ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ enum์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์ˆ˜์— ๋Œ€ํ•ด ์ฝ”๋“œ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์„๋•Œ ์ฝ”๋“œ ๋ถ„์„์—†์ด๋„ ์†์‰ฝ๊ฒŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋„ ํ•œ ๊ณณ์—์„œ ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

2. ์ƒํƒœ์™€ ํ–‰์œ„๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ

์ฝ”๋“œ์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ ๋กœ์ง์ด ๋ถ„๊ธฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์ƒํƒœ์™€ ํ–‰์œ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ๋”ฐ๋ฅธ if๋ฌธ ๋ถ„๊ธฐ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๋กœ์ง์ด ์ •ํ•ด์ ธ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŠน์ • ์ฝ”๋“œ์— ๋Œ€ํ•ด ํŠน์ • ๋กœ์ง์„ ๋งŒ๋“ค์–ด๋„ ์„œ๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ๋Œ€ํ•ด ์–ด๋–ค ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ history๊ด€๋ฆฌ๊ฐ€ ์•ˆ๋˜์—ˆ๋‹ค๋ฉด ์ „ํ˜€ ์•Œ ์ˆ˜์—†๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ž‘์—…์„ ๋˜ํ•˜๊ฑฐ๋‚˜ ์ด์ „๊ณผ๋Š” ๋‹ค๋ฅธ ๋กœ์ง์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ์™€ ํ–‰์œ„ ๋ถ„๋ฆฌ ์‹œ ๋ฌธ์ œ์ 

  • ์ค‘๋ณต ์ฝ”๋“œ ์ƒ์„ฑ
  • ํžˆ์Šคํ† ๋ฆฌ ๋ฌด์ง€๋กœ ์ธํ•œ ๋ณ€๊ฒฝ ๋ฐœ์ƒ ์‹œ ๋กœ์ง ์ฐจ์ด ๋ฐœ์ƒ
  • ๊ด€๋ฆฌ ํฌ์ธํŠธ ์ฆ๊ฐ€

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Enum์ด ํŠน์ • ์ฝ”๋“œ๋ณ„๋กœ ํŠน์ • ํ–‰์œ„๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

enum CertificationMethodEnum {
    ID_CERTIFICATION("์‹ ๋ถ„์ฆ์ธ์ฆ", "I", () -> {
        // ์‹ ๋ถ„์ฆ ์ธ์ฆ ๋กœ์ง
        return true;
    })
    , MOBILE_CERTIFICATION("ํ•ธ๋“œํฐ์ธ์ฆ", "M", () -> {
        // ํ•ธ๋“œํฐ ์ธ์ฆ ๋กœ์ง
        return true;
    });

    private final String context;
    private final String code;
    private final BooleanSupplier execute;

    CertificationMethodEnum(String context, String code, BooleanSupplier execute) {
        this.context = context;
        this.code = code;
        this.execute = execute;
    }

    public String getContext() {
        return context;
    }

    public String getCode() {
        return code;
    }

    public boolean executeLogic() {
        return execute.getAsBoolean();
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ์ฝ”๋“œ์— ๋Œ€ํ•ด `executeLogic()`์„ ์‹คํ–‰ํ•˜๋ฉด ํŠน์ •์ฝ”๋“œ์— ๋Œ€ํ•œ ๋กœ์ง์„ ์–ด๋””์„œ๋‚˜ ๋ณ€ํ•จ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

(Enum ์ƒ์ˆ˜๊ฐ€ ์ง์ ‘ ๋กœ์ง์„ ์ˆ˜ํ–‰)

3. ๋ฐ์ดํ„ฐ ๊ทธ๋ฃน๊ด€๋ฆฌ

1๋ฒˆ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ๊ฐ„ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ `๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃน๋ณ„๋กœ ๊ด€๋ฆฌ`ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 `๋ณธ์ธ์ธ์ฆ`์„ ์ฃผ์ œ๋กœ ๋ฐ์ดํ„ฐ ๊ทธ๋ฃน๊ด€๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ €, `๋ณธ์ธ์ธ์ฆ`์€ `๋ณธ์ธ์ธ์ฆ์ˆ˜๋‹จ`๊ณผ `์ธ์ฆ๋ฐฉ๋ฒ•`์œผ๋กœ ๋‚˜๋ˆ ์ง‘๋‹ˆ๋‹ค.

`๋ณธ์ธ์ธ์ฆ์ˆ˜๋‹จ`์—๋Š” `์‹ ๋ถ„์ฆ์ธ์ฆ`๊ณผ `ํ•ธ๋“œํฐ์ธ์ฆ`์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

enum CertificationGroup {
    ID_CERTIFICATION("์‹ ๋ถ„์ฆ์ธ์ฆ", Arrays.asList(CertificationWay.ID, CertificationWay.LICENSE)),
    MOBILE_CERTIFICATION("ํ•ธ๋“œํฐ์ธ์ฆ", Arrays.asList(CertificationWay.SKT, CertificationWay.KT, CertificationWay.LG)),
    EMPTY("EMPTY", Collections.EMPTY_LIST),
    ;

    private final String description;
    private final List<CertificationWay> certificationWayList;

    CertificationGroup(String description, List<CertificationWay> certificationWayList) {
        this.description = description;
        this.certificationWayList = certificationWayList;
    }

    public static CertificationGroup findByCertificationWay(CertificationWay certificationWay) {
        return Arrays.stream(CertificationGroup.values())
                .filter(certificationGroup -> certificationGroup.hasCertificationWay(certificationWay))
                .findAny()
                .orElse(EMPTY);
    }

    private boolean hasCertificationWay(CertificationWay certificationWay) {
        return certificationWayList.stream()
                .anyMatch(way -> way.equals(certificationWay));
    }
}

enum CertificationWay {
    ID("์ฃผ๋ฏผ๋“ฑ๋ก์ฆ"),
    LICENSE("์šด์ „๋ฉดํ—ˆ์ฆ"),
    SKT("SKT"),
    KT("KT"),
    LG("LG");

    private final String description;

    CertificationWay(String description) {
        this.description = description;
    }
}

์ด์ œ `๋ณธ์ธ์ธ์ฆ๋ฐฉ๋ฒ•`์— ๋Œ€ํ•œ `๋ณธ์ธ์ธ์ฆ์ˆ˜๋‹จ`์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ๊ฐ `์ธ์ฆ๋ฐฉ๋ฒ•`์— ๋Œ€ํ•œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ชจ๋“  `์ธ์ฆ์ˆ˜๋‹จ`์— ํ•ด๋‹น ๋กœ์ง์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

https://techblog.woowahan.com/2527/