ToBe끝판왕

[ JAVA ] 열거형 ( ENUM ) 본문

■ 프로그래밍 SKILLS/JAVA

[ JAVA ] 열거형 ( ENUM )

업그레이드중 2024. 8. 20. 21:01
반응형



 


 

 

열거형 - ENUM

 

 

•  관련된 상수들의 집합을 정의하는데 사용되는 특수한 데이터 타입

•  의미가 명확한 상수 집합을 만들 수 있고, 코드의 가독성 및 유지보수성을 높일 수 있다.

 

 

※  String ( 문자열 ) 사용시 문제점

 

•   타입 안정성 부족

-  문자열은 오타가 발생하기 쉽다.

-  유효하지 않은 값이 입력될 수 있다.

-  컴파일 시 오류감지가 불가하고 런타임에서만 발견되므로 디버깅이 힘들다.

 

•  데이터 일관성 

-  다양한 형식으로 데이터를 입력할 수 있어 일관성이 떨어진다.

 


 

타입 안전 열거형 패턴 ( Type - Safe Enum Pattern )

 

•  타입 안전 열거형 패턴을 사용하면, 나열한 항목만 사용이 가능하다.

•  타입 안전성 향상  :  정해진 객체만 사용이 가능하여 잘못된 값이 입력되는 문제를 근본적으로 해결

•  데이터 일관성  :  정해진 객체만 사용하므로 데이터의 일관성 보장

 

•  타입 안전 열거형 패턴을 편리하게 사용할 수 있는 열거형( Enum Type ) 을 제공

-  열거형을 정의할 때, class 대신 enum 을 사용

-  원하는 상수의 이름을 나열

-  열거형을 사용하는 경우 static import 를 적절하게 사용하면 더 읽기 좋은 코드를 만들 수 있다

 

 

 

•  열거형 예시

-  열거형도 클래스이다.

-  열거형은 자동으로 java.lang.Enum을 상속받는다. ( 추가로 다른 클래스 상속 불가 )

-  열거형은 인터페이스를 구현 가능하다.

-  외부에서 임의로 생성 X

 

package enumeration.ex3;

public enum Grade {

    BASIC, GOLD, DIAMOND;
}


// 위 열거형은 아래의 코드와 의미가 같다.


public class Grade extends Enum { 

	public static final Grade BASIC = new Grade();
    public static final Grade GOLD = new Grade();
    public static final Grade DIAMOND = new Grade();
    
    // private 생성자
    private Grade() {}
}
package enumeration.ex3;

public class DiscountService {

    public int discount(Grade classGrade, int price) {
        int discountPercent = 0;

         if( classGrade == Grade.BASIC) {
             discountPercent = 10;
         } else if( classGrade == Grade.GOLD ) {
             discountPercent = 20;
         } else if( classGrade == Grade.DIAMOND ) {
             discountPercent = 30;
         } else {
             System.out.println("할인 X");
         }

        // 할인금액을 return 해준다
        return price * discountPercent / 100;
    }
}
package enumeration.ex3;

public class ClassGradeEx3_1 {

    public static void main(String[] args) {

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

        System.out.println("BASIC 등급의 할인 금액: " + basic);
        System.out.println("GOLD 등급의 할인 금액: " + gold);
        System.out.println("DIAMOND 등급의 할인 금액: " + diamond);
    }
}
// 실행 결과

BASIC 등급의 할인 금액: 1000
GOLD 등급의 할인 금액: 2000
DIAMOND 등급의 할인 금액: 3000

 

 

 

•  열거형은 외부에서 생성 불가

 

package enumeration.ex3;

public class ClassGradeEx3_2 {

    public static void main(String[] args) {

        int price = 10000;

        DiscountService discountService = new DiscountService();

    
    /*  Grade grade = new Grade();  // enum은 인스턴스 생성 불가
        int result = discountService.discount(newClassGrade, price);
        System.out.println("newClassGrade 등급의 할인 금액: " + result);
    */

    }
}

 

 

 

•  열거형 주요 메서드

-  java.lang.Enum 클래스를 자동 상속받기 때문에 해당 클래스가 제공하는 메서드를 사용 가능

-  values()  :  모든 ENUM 상수를 포함하는 배열을 반환

-  valueOf(String name)  :  주어진 이름과 일치하는 ENUM 상수를 반환

-  name()  :  ENUM 상수 이름을 문자열로 반환

-  ordinal()  :  ENUM 상수의 선언 순서( 0부터 시작) 을 반환

package enumeration.ex3;

import java.util.Arrays;

public class EnumMain {

    public static void main(String[] args) {

        // 모든 ENUM 반환
        Grade[] values = Grade.values();
        System.out.println("values = " + Arrays.toString(values));
        for (Grade value : values) {
            System.out.println("name = " + value.name() + ", ordinal = " + value.ordinal());
        }

        // String --> ENUM 변환, 잘못된 문자면 IllegalArgumentException 발생
        String input = "GOLD";
        Grade gold = Grade.valueOf(input);
        System.out.println("gold = " + gold);
    }
}

 

 

 

※ 해당 내용은 인프런 김영한 강사님의  "실전 자바 중급1" 인강의 참고자료와 예시들을 참고하였습니다

 

반응형

'■ 프로그래밍 SKILLS > JAVA' 카테고리의 다른 글

[ JAVA ] 예외 처리 (2)  (0) 2024.08.21
[ JAVA ] 예외 처리 (1)  (0) 2024.08.21
[ JAVA ] 래퍼 클래스 ( Wrapper Class )  (0) 2024.08.20
[ JAVA ] String 클래스 (2)  (0) 2024.08.19
[ JAVA ] String 클래스 (1)  (0) 2024.08.13
Comments