봄디의 개발일지
[JAVA] Enum이란? (Enum 사용법, 메소드 정리) 본문
Enum 이란?
enumeration
의 줄임말로, 열거라는 뜻이며, 어떤 항목을 나열하는 것을 의미한다.- 일련의 명명된 상수들을 사용하여 코드 내에서 미리 정의된 값들의 집합을 나타낸다.
Enum 을 사용하는 이유?
- 타입 안정성 향상 : 정해진 객체만 사용할 수 있기에 잘못된 값을 입력하는 문제를 방지할 수 있다.
- 데이터 일관성 : 정해진 객체만 사용하므로 데이터의 일관성이 보장된다.
- 변경의 최소화 : 리팩토링 시 변경 범위가 최소화 된다. (내용의 추가가 필요해도, 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);
}
}
- values() : 모든 ENUM 상수를 포함하는 배열을 반환한다.
- name() : 열거 객체가 가지고 있는 문자열 반환, 반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일하다.
- ordinal() : ENUM 상수의 선언 순서를 반환한다. 하지만, orginal()은 가급적 사용하지 않는 것이 좋다.
- ordinal() 을 사용하다가 중간에 상수를 선언하는 위치가 변경되면 전체 상수의 위치가 모두 변경될 수 있기 때문에다.
- valueOf() : 모든 ENUM 상수를 포함하는 배열을 반환한다.
- compareTo() : 객체를 비교해서 순서 차이를 반환한다.
- 예를 들어, 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수를 리턴 한다.
- 열거 객체가 매개값의 열거 객체보다 순번이 느리다면 양수를 리턴 한다.
- SPRING 이 SUMMER 보다 하나 앞에 있기 때문에 -1을 리턴하고, WINTER이 SPRING보다 세 개 뒤에 있기 때문에 3을 리턴한다.
🔍 참고글
인프런 [김영한의 실전 자바 - 중급 1편] 열거형 - ENUM 강의를 참고하여 작성했습니다.
'자바' 카테고리의 다른 글
[JAVA] 컬렉션 - List 정리 (ArrayList, LinkedList) (3) | 2024.10.06 |
---|---|
[JAVA] 자바 메모리 구조 (2) | 2024.09.15 |
[Intellij] 인텔리제이 자주 사용하는 단축키 모음 (윈도우) (3) | 2024.09.08 |
[JAVA] StringBuilder 사용법과 메소드 총정리 (3) | 2024.09.08 |
[JAVA] String이란? (String이 불변 객체인 이유 / String 메소드 정리) (2) | 2024.09.06 |