Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

봄디의 개발일지

[JAVA] Enum이란? (Enum 사용법, 메소드 정리) 본문

자바

[JAVA] Enum이란? (Enum 사용법, 메소드 정리)

bomdy 2024. 7. 13. 03:41

Enum 이란?

  • enumeration 의 줄임말로, 열거라는 뜻이며, 어떤 항목을 나열하는 것을 의미한다.
  • 일련의 명명된 상수들을 사용하여 코드 내에서 미리 정의된 값들의 집합을 나타낸다.

Enum 을 사용하는 이유?

  1. 타입 안정성 향상 : 정해진 객체만 사용할 수 있기에 잘못된 값을 입력하는 문제를 방지할 수 있다.
  2. 데이터 일관성 : 정해진 객체만 사용하므로 데이터의 일관성이 보장된다.
  3. 변경의 최소화 : 리팩토링 시 변경 범위가 최소화 된다. (내용의 추가가 필요해도, Enum코드만 수정하면 된다)
package enumeration.ex0;

public class DiscountService {
    public int discount(String grade, int price) {
        int discountPercent = 0 ;

        if (grade.equals("BASIC")) {
            discountPercent = 10;
        } else if (grade.equals("GOLD")) {
            discountPercent = 20;
        } else if (grade.equals("DIAMOND")) {
            discountPercent = 30;
        } else {
            System.out.println(grade + ": 할인X");
        }
        return price * discountPercent / 100; // 할인하는 금액이 된다.
    }
}
package enumeration.ex0;

public class StringGradeEx0_1 {
    public static void main(String[] args) {
        int price = 10000;

        DiscountService discountService = new DiscountService();
        int basic = discountService.discount("BASIC", price);
        int gold = discountService.discount("GOLD", price);
        int diamond = discountService.discount("DIAMOND", price);

        System.out.println("BASIC 등급의 할인 금액 : " + basic);
        System.out.println("gold 등급의 할인 금액 : " + gold);
        System.out.println("diamond 등급의 할인 금액 : " + diamond);
    }
}
  • 코드를 위와 같이 작성한다면, 문제가 발생하지 않지만, discount 메소드는 String 을 넘겨받기 때문에, StringGradeEx0_1 클래스에 int ggggold = discountService.discount("GGGOLD", price); 를 추가하고, 출력을 했을 때 컴파일 시점에 발견되지 않고, ggggold 등급의 할인 금액 : 0 이 출력되어 후에 문제가 발생할 수 있다.

⭐ Enum 사용법

package enumeration.ref3;

public enum Grade {
    BASIC(10), GOLD(20), DIAMOND(30);

    private final int discountPercent;

    Grade(int discountPercent) {
        this.discountPercent = discountPercent;
    }

    public int getDiscountPercent() {
        return discountPercent;
    }

    public int discount(int price) {
        return price * discountPercent / 100;
    }
}
  • 열거형을 정의할 때는 class 대신에 enum 을 사용하면 되고, 원하는 상수의 이름을 나열하면 된다.
  • Enum 또한 클래스이기 때문에 메소드를 생성할 수 있고, 생성자는 private으로 저절로 막혀있기 때문에 생성자에 접근 지정자를 작성하지 않아도 된다.
  • 위와 같이 discountPercent 필드를 추가하는 경우, 생성자를 통해 필드에 값을 저장하고, BASIC(10) 과 같이 생성자에 맞는 인수를 전달하면 적절한 생성자가 호출된다.

⭐ Enum 사용 예제

package enumeration.ref3;


public class EnumRefMain3_4 {
    public static void main(String[] args) {

        int price = 10000;

        Grade[] grades = Grade.values();
        for (Grade grade : grades) {
            printDiscount(grade, price);
        }
    }

    private static void printDiscount(Grade grade, int price) {
        System.out.println(grade.name() + " 등급의 할인 금액 : " + grade.discount(price));
    }
}

 

  • 위에 있는 Grade 클래스를 사용해서 각 등급별 할인 금액을 출력하는 예제입니다.
  • ENUM의 values() 메소드를 사용해서 열거형의 모든 ENUM 상수를 포함하는 배열을 반환하여 grades 배열에 저장한 후, printDiscount 메소드를 사용해서 등급의 할인 금액을 출력한다.

⭐ Enum 메소드 알아보기

메소드 설명 리턴 타입
values() 모든 ENUM 상수를 포함하는 배열을 반환한다. enum[]
name() ENUM 상수의 이름을 문자열로 반환한다. String
valueOf(String name) 주어진 이름과 일치하는 ENUM 상수를 반환한다. enum
compareTo() 객체를 비교해서 순번 차이를 반환한다. int
ordinal() ENUM 상수의 선언 순서 (0부터 시작)를 반환한다. int

 

package enumeration.ex2;

public enum Season {
    SPRING, SUMMER, FALL, WINTER
}
package enumeration.ex2;

import java.util.Arrays;
import java.util.Scanner;

public class EnumEx {
    public static void main(String[] args) {

        // values() 예제
        Season [] seasons = Season.values();
        System.out.println("Seasons = " + Arrays.toString(seasons) + "\n");

        // name() , ordinal() 예제
        for (Season season : seasons) {
            System.out.println("name = " + season.name() + ", ordinal = " + season.ordinal());
        }

        // valueOf() 예제
        Scanner scanner = new Scanner(System.in);
        Season value = Season.valueOf(scanner.nextLine().toUpperCase());
        System.out.println("value = " + value + "\n");

        // compareTo() 예제
        int compare1 = Season.SPRING.compareTo(Season.SUMMER);
        System.out.println(compare1);
        int compare2 = Season.WINTER.compareTo(Season.SPRING);
        System.out.println(compare2);
    }
}

  1. values() : 모든 ENUM 상수를 포함하는 배열을 반환한다.
  2. name() : 열거 객체가 가지고 있는 문자열 반환, 반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일하다.
  3. ordinal() : ENUM 상수의 선언 순서를 반환한다. 하지만, orginal()은 가급적 사용하지 않는 것이 좋다.
  • ordinal() 을 사용하다가 중간에 상수를 선언하는 위치가 변경되면 전체 상수의 위치가 모두 변경될 수 있기 때문에다.
  1. valueOf() : 모든 ENUM 상수를 포함하는 배열을 반환한다.
  2. compareTo() : 객체를 비교해서 순서 차이를 반환한다.
  • 예를 들어, 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수를 리턴 한다.
  • 열거 객체가 매개값의 열거 객체보다 순번이 느리다면 양수를 리턴 한다.
  • SPRING 이 SUMMER 보다 하나 앞에 있기 때문에 -1을 리턴하고, WINTER이 SPRING보다 세 개 뒤에 있기 때문에 3을 리턴한다.

 


🔍 참고글

인프런 [김영한의 실전 자바 - 중급 1편]  열거형 - ENUM 강의를 참고하여 작성했습니다.