오늘은 열거형
Enum에 대해
알아보겠습니다 !!!
1) 열거형 - Enum Type
public enum Grade {
GOLD , BASIC , DIAMOND}
회원의 등급은 상수로 정의한 `BASIC` , `GOLD` , `DIAMOND` 만 사용할 수 있다는 뜻이다.
열거형을 정의할 때는 `class` 대신에 `enum` 을 사용한다.
원하는 상수의 이름을 나열하면 된다
enum 타입을 활용해
등급별로 할인액이 달라지는 코드를
만들어볼게요
public class DiscountService {
public int discount(Grade grade , int price) {
int discountPercent = 0;
switch (grade) {
case BASIC:
discountPercent = 10;
break;
case GOLD :
discountPercent = 20;
break;
case DIAMOND :
discountPercent = 30;
break;
default:
System.out.println("할인X");
break;
}
return price * discountPercent / 100;}}
일단
switch문을 활용해
각 케이스 (grade 등급)
별로 할인퍼센트를 적용한 후
마지막에 입력값 * 할인% / 100 을 리턴했습니다
import java.util.Scanner;
public class Enum_Ex {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("가격을 입력하시오(등급별 할인금액이 뜹니다) : ");
int price = scan.nextInt();
DiscountService discountService = new DiscountService();
int basicDiscount = discountService.discount(Grade.BASIC, price);
int goldDiscount = discountService.discount(Grade.GOLD, price);
int diamondDiscount = discountService.discount(Grade.DIAMOND, price);
System.out.println("Basic 할인금액 : "+basicDiscount);
System.out.println("Gold 할인금액 : "+goldDiscount);
System.out.println("Diamond 할인금액 : "+diamondDiscount);
}}
출력))
가격을 입력하시오(등급별 할인금액이 뜹니다) : 10000
Basic 할인금액 : 1000
Gold 할인금액 : 2000
Diamond 할인금액 : 3000
enum 은 내부에서 열거형 상수를 지정하는것 외에는
직접 생성할수 없음..
Grade grade = new Grade(); 불가능
열거형(ENUM)의 장점**
**타입 안정성 향상**: 열거형은 사전에 정의된 상수들로만 구성되므로, 유효하지 않은 값이 입력될 가능성이 없다. 이
런 경우 컴파일 오류가 발생한다.
**간결성 및 일관성**: 열거형을 사용하면 코드가 더 간결하고 명확해지며, 데이터의 일관성이 보장된다.
**확장성**: 새로운 회원 등급을 타입을 추가하고 싶을 때, ENUM에 새로운 상수를 추가하기만 하면 된다.
2) 열거형 - 주요 메서드
**ENUM - 주요 메서드**
**values()**: 모든 ENUM 상수를 포함하는 배열을 반환한다.
**valueOf(String name)**: 주어진 이름과 일치하는 ENUM 상수를 반환한다.(일치하지않으면 컴파일오류)
**name()**: ENUM 상수의 이름을 문자열로 반환한다.
**ordinal()**: ENUM 상수의 선언 순서(0부터 시작)를 반환한다. (사용 추천 X)
**toString()**: ENUM 상수의 이름을 문자열로 반환한다. `name()` 메서드와 유사하지만, `toString()` 은 직접
오버라이드 할 수 있다.
public class EnumMethodMain {
public static void main(String[] args) {
Grade[] values = Grade.values();
String string = Arrays.toString(values);
System.out.println(string);
String str = "GOLD";
String str2 = "gold";
Grade valueOf = Grade.valueOf(str);
// Grade valueOf2 = Grade.valueOf(str2); // 오류발생
System.out.println("value : "+valueOf);
}}
3) 열거형 - 리팩토링
열거형을 정의할때
할인율까지 같이 적용해보면 어떨까??
더욱 Service클래스가 간단해질것이다
한번 만들어보자
public enum Grade2 {
BASIC(10),GOLD(20),DIAMOND(30),VIP(50);
private final int discount;
Grade2(int discount){
this.discount = discount;
}
public int getDiscount() {
return discount;
}}
discount 필드를 추가하고
생성자로 discount를 받는다
그 후
값 조회를 위해
getDiscount()메서드를 정의해줌
public class DiscountService2 {
public int discountService(Grade2 grade , int price) {
return price * grade.getDiscount()/100;
}}
기존에 있던 조건문이 다 사라지고
깔끔한 서비스클래스가 완성
4) 열거형 - 리팩토링2
위에코드를 보면 아시겠지만
그냥 enum 자체에서
할인율 계산까지 하면 안될까??
한번 해보자!!
이제 Service 클래스는 필요없어졌다 !
public enum Grade3 {
BASIC(10),GOLD(20),DIAMOND(30),VIP(50);
private final int discount;
Grade3(int discount){
this.discount = discount;
}
public int getDiscount() {
return discount;
}
public int Discount( int price) {
return price * discount / 100;
}}
///////////////
public class Enum_Ex3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("구매 가격 입력 : ");
int price = scan.nextInt();
printDiscount(Grade3.BASIC, price);
printDiscount(Grade3.GOLD, price);
printDiscount(Grade3.DIAMOND, price);
printDiscount(Grade3.VIP, price);
}
public static void printDiscount(Grade3 grade,int price) { //중복제거를 위한 출력메서드
System.out.println("grade : "+grade.name() +
" 할인액 : "+grade.Discount(price));
}}
//////출력
구매 가격 입력 : 8000
grade : BASIC 할인액 : 800
grade : GOLD 할인액 : 1600
grade : DIAMOND 할인액 : 2400
grade : VIP 할인액 : 4000
이렇게해서
새로운 등급이 추가가 되면
enum안에 상수 와 매개변수(생성자에 있는 지역변수)
만 수정해주면 됨!!
문제와 풀이1
문제1 - 인증 등급 만들기
**문제 설명**
패키지의 위치는 `enumeration.test` 를 사용하자.
회원의 인증 등급을 `AuthGrade` 라는 이름의 열거형으로 만들어라.
인증 등급은 다음 3가지이고, 인증 등급에 따른 레벨과 설명을 가진다.
레벨과 설명을 `getXxx()` 메서드로 조회할 수있어야 한다.
GUEST(손님)
level=1
description=손님
LOGIN(로그인 회원)
level=2
description=로그인 회원
ADMIN(관리자)
level=3
description=관리자
정답
public enum AuthGrade {
GUEST(1,"손님"),LOGIN(2,"로그인 회원"),ADMIN(3,"관리자");
private final int level;
private final String description;
AuthGrade(int level , String description){
this.level = level;
this.description = description;
}
public int getLevel() {
return level;
}
public String getDescription() {
return description;
}}
문제2 - 인증 등급 열거형 조회하기
public class AuthGradeMain1 {
public static void main(String[] args) {
printAuth(AuthGrade.GUEST);
printAuth(AuthGrade.LOGIN);
printAuth(AuthGrade.ADMIN);
}
private static void printAuth(AuthGrade auth) {
System.out.println(auth.name()+"| level : "+auth.getLevel()+
" | description : "+auth.getDescription());
}}
출력
GUEST| level : 1 | description : 손님
LOGIN| level : 2 | description : 로그인 회원
ADMIN| level : 3 | description : 관리자
문제3 - 인증 등급 열거형 활용하기
**문제 설명**
`AuthGradeMain2` 클래스에 코드를 작성하자.
인증 등급을 입력 받아서 앞서 만든 `AuthGrade` 열거형으로 변환하자.
인증 등급에 따라 접근할 수 있는 화면이 다르다.
예를 들어 GUEST 등급은 메인 화면만 접근할 수 있고, ADMIN 등급은 모든 화면에 접근할 수 있다.
각각의 등급에 따라서 출력되는 메뉴 목록이 달라진다.
다음 출력 결과를 참고해서 코드를 완성하자.
**GUEST 입력 예**
```
당신의 등급을 입력하세요[GUEST, LOGIN, ADMIN]: GUEST
당신의 등급은 손님입니다.
==메뉴 목록==
- 메인 화면
```**LOGIN 입력 예**
```
당신의 등급을 입력하세요[GUEST, LOGIN, ADMIN]: LOGIN
당신의 등급은 로그인 회원입니다.
==메뉴 목록==
- 메인 화면
- 이메일 관리 화면
```
**ADMIN 입력 예**
```
당신의 등급을 입력하세요[GUEST, LOGIN, ADMIN]: ADMIN
당신의 등급은 관리자입니다.
==메뉴 목록==
- 메인 화면
- 이메일 관리 화면
- 관리자 화면
메인코드
public class AuthMain2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("등급을 입력하세요[GUEST , LOGIN , ADMIN ] : ");
String grade = scan.nextLine();
Auth.type(grade);
}}
출력 클래스(정적메서드활용)
public class Auth {
public static void type(String auth){
AuthGrade valueOf = AuthGrade.valueOf(auth.toUpperCase());//대문자로 변경 후 --> enum타입으로 변경
System.out.println("당신의 권한 : "+valueOf.getDescription()); //권한 조회
System.out.println("== 메뉴 목록 ==");
if(valueOf.getLevel()==1) {
System.out.println(" -메인화면");
}
else if(valueOf.getLevel()==2) {
System.out.println(" -메인화면 \n -이메일관리화면");
}
else if(valueOf.getLevel()==3) {
System.out.println(" -메인화면 \n -이메일관리화면 \n -관리자화면");
}}}
'Java공부(코딩)' 카테고리의 다른 글
코딩초보의 자바(Java)공부 20일차 { 중첩 클래스 , 내부클래스 1} (2) | 2025.01.02 |
---|---|
코딩초보의 자바(Java)공부 19일차 { 날짜와 시간 } (3) | 2025.01.02 |
코딩초보의 자바(Java)공부 17일차 { 래퍼 , Class 클래스 } (5) | 2024.12.30 |
코딩초보의 자바(Java)공부 16일차 { String 클래스 } (4) | 2024.12.29 |
코딩초보의 자바(Java)공부 15일차 { Object클래스 } (2) | 2024.12.25 |