Java공부(코딩)

코딩초보의 자바(Java)공부 18일차 { 열거형 -ENUM - }

동곤일상 2024. 12. 31. 18:25
반응형
오늘은 열거형 
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 -관리자화면");

}}}