BackEnd/Java
[Java] Enum(열거형)과 상수
ryuneng
2025. 1. 16. 00:04
반응형
# 목적
: JAVA의 Enum(열거형)과 상수에 대한 학습
Enum 이란?
: 상수값(상수 데이터)의 집합 미리 값이 정해져 있는 한정된 데이터의 묶음, 상수의 단점을 보완
ex)
- 고객등급 : Gold, Silver, Bronze
- 학 점 : A, B, C, D, F
- 계 절 : 봄, 여름, 가을, 겨울
- 등급별 포인트 적립률 : Gold(0.05), Silver(0.02), Bronze(0.01)
- Enum의 형식
enum 열거형이름 {
상수, 상수, 상수;
}
* 열거형이름 : 클래스이름처럼 첫번째 글자를 대문자로 하고, 나머지는 소문자로 작성
* 상수 : 전부 대문자로 작성, 두 단어 이상의 조합일 때에는 "_"로 연결함
- 열거형 정의하기
// 1.
public enum Grade {
GOLD, SILVER, BRONZE; // 열거형은 상수값이라서 대문자로 작성함
}
// 2.
public enum Grade {
A(4.5), B(3.0), C(2.0), D(1.0), F(0.0);
}
Enum의 장점
1. 허용가능한 값들을 제한함
* 열거형 상수가 특정 열거타입에 포함되어 있기 때문에, 열거형 변수에 대입가능한 값은 해당 열거형의 열거상수들 뿐
ex)
// 열거형이 아닐 때
static final int GOLD = 1;
static final int SILVER = 2;
int customerGrade = GOLD;
int customerGrade = 100; // 고객등급과 상관없는 값이 대입되어도 에러가 발생하지 않음
// 열거형일 때
enum Grade {
GOLD, SILVER, BRONZE;
}
Grade grade = Grade.GOLD;
Grade grade = 100; // 컴파일 오류 발생
2. 개발도구(Eclipse, Intellij) 의 자동완성, 문법오류 체크 등을 지원받을 수 있음
3. 조건식에서 ==으로 비교 가능, switch문에서도 바로 사용 가능
Enum의 주요 내장 메소드
- String name()
> 열거객체가 가지고 있는 문자열을 반환함
> 문자열은 열거상수의 이름과 동일함 - int ordinal()
> 열거객체의 순번(0번부터 시작하는)을 반환함 - int compareTo(enum other)
> 지정된 열거객체와 순번을 비교해서 정수값을 반환함
> 전달받은 다른 열거객체의 순번보다 빠르면 음수 반환, 순번이 늦으면 양수 반환 - enum valueOf(String name)
> 매개변수로 전달받은 문자열과 동일한 이름을 가지는 열거객체를 생성해서 반환함* 다른 형태로 가져올 때 사용 ex) DB에서 문자열로 받아올 때
- enum[] values()
> 해당 열거형의 모든 열거상수들에 대한 열거객체를 배열로 반환함 * name(), valueOf() 관계 열거객체 ---> 문자열 Grade.GOLD name() "GOLD" 문자열 ---> 열거객체 "GOLD" Grade.valueOf("GOLD") Grade.GOLD
* Enum과 상수값 매핑하기
enum ScoreGrade {
수(90), 우(80), 미(70), 양(60), 가(50);
// 1. 상수 : 고유한 값
private int score;
// 2. 생성자 : 외부에서 객체생성하지 못하게 private (default생성자 허용x)
private ScoreGrade(int score) {
this.score = score;
}
// 3. Getter : 고유한 값을 조회하기 위해 생성, 값을 바꾸지 못하도록 Setter는 제공x (상수이기 때문에)
public int getScore() {
return score;
}
}
상수 란?
- 프로그램이 실행되는동안 변하지 않는 값 (미리 값이 정해진 데이터)
- 상수 정의하기 (public static final 타입 상수명 = 값;)
ex)
public class Constants {
public static final int GOLD = 1;
public static final int SILVER = 2;
public static final int BRONZE = 3;
public static final double GOLD_POINT_DEPOSIT_RATE = 0.05;
public static final double SILVER_POINT_DEPOSIT_RATE = 0.02;
public static final double BRONZE_POINT_DEPOSIT_RATE = 0.01;
public static final long MAX_UPLOAD_SIZE = 1024*1024*10;
public static final long MAX_TIME_OUT = 60*60*1000; // 1시간을 나타내는 밀리초 단위
}
상수를 정의하는 목적
1. 가독성 향상
// 상수를 사용하지 않은 경우
public int getDepositPoint(int customerGrade, int amount) {
if (customerGrade == 1) {
return (int) (amount*0.05);
} else if (customerGrade == 2) {
return (int) (amount*0.02);
} else if (customerGrade == 3) {
return (int) (amount*0.01);
}
return 0;
}
// 상수를 사용한 경우 - 가독성 향상
public int getDepositPoint(int customerGrade, int amount) {
if (customerGrade == Constants.GOLD) {
return (int) (amount*0.05);
} else if (customerGrade == Constants.SILVER) {
return (int) (amount*0.02);
} else if (customerGrade == Constants.BRONZE) {
return (int) (amount*0.01);
}
return 0;
}
2. 유지보수성 향상
1) 위의 상수란? > 상수 정의하기 ex)
에서 Constants의 상수값을 변경하기만 하면 해당 상수값을 사용하는 모든 클래스에 변경된 값이 적용됨
2) 상수값들간에 상관관계가 있는 경우 2배, 3배, 1/2배 등... 상수값을 그 상관관계를 표현하는 식으로 작성
ex)
final double GOLD_DEPOSIT_RATE = 0.1;
final double SILVER_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/2;
final double BRONZE_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/4;
final double GUEST_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/8;
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Java-Enum-열거형