Enum이란
Enumeration의 약자로 몇 가지 상수의 집합을 정의하는 타입으로 클래스의 특수한 형태이다.
집합이 갖는 값이 한정되어 있고 다른 값이 허용되지 않는 경우에 사용된다.
ex)
- 사계절 : 봄, 여름, 가을, 겨울
- 요일 : 월, 화, 수, 목, 금, 토, 일
- 성별 : 남성, 여성
사용 이유
1. 코드가 단순해지며, 가독성이 좋아진다.
2. 인스턴스 생성과 상속을 방지하여 컴파일 시에 상수값의 타입안정성이 보장된다.
3. enum 키워드를 통해 구현의 의도가 열거임을 분명하게 알 수 있다.
내부 API
public enum Rank {
THREE(3, 4_000),
FOUR(4, 10_000),
FIVE(5, 30_000);
private final int match;
private final int money;
private int count;
Rank(int match, int money) {
this.match = match;
this.money = money;
}
public void plusCount() {
this.count++;
}
}
1. values()
- Enum 클래스가 가지고 있는 모든 상수 값을 배열의 형태로 리턴한다. 이때 단순히 String의 형태로 반환하는 것이 아니라 인스턴스를 반환하게된다.
public static void main(String[] args) {
Rank[] values = Rank.values();
for(int i = 0; i< values.length; i++) {
System.out.println(values[i]);
}
}
// 실행 결과 : THREE, FOUR, FIVE
2. valueOf()
- String을 파라미터로 받는데 인자로 들어온 String과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환한다.
public static void main(String[] args) {
System.out.println(Rank.valueOf("THREE"));
}
// 실행 결과 : THREE
3. ordinal()
- Enum 클래스 내부에 있는 상수들의 Index를 리턴하는 메소드이다. 배열과 마찬가지로 0부터 인덱스가 시작되며 인덱스의 length는 상수의 수 -1 이다.
public static void main(String[] args) {
Rank[] values = Rank.values();
for(int i = 0; i< values.length; i++) {
System.out.println(values[i] + "인덱스는 : " + values[i].ordinal());
}
}
// 실행 결과
// THREE인덱스는 : 0
// FOUR인덱스는 : 1
// FIVE인덱스는 : 2
코드 예제
사계절의 상수를 가지는 열거타입의 Season 생성
public enum Season {
SPING,
SUMMER,
AUTUMN,
WINTER
}
Month의 상수를 가지는 열거타입의 Month 생성
public enum Month {
JAN,
FEB,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC
}
사계절(한글)의 상수를 가지는 열거타입의 계절 생성
public enum 계절 {
봄,
여름,
가을,
겨울
}
Main 함수
public static void main(String[] args) {
// new 연산자로 열거타입을 생성할 수 없다
// Season season = new Season();
//열거변수 선언하여 값 가져오기
Season spring = Season.SPING;
Season summer = Season.SUMMER;
Season autumn = Season.AUTUMN;
Season winter = Season.WINTER;
//.values() 메서드로 배열 리턴
Month[] months = Month.values();
//Calendar 클래스에서 이번달 값 받아오기
Calendar cal = Calendar.getInstance();
int month = cal.get(2);
//이번달 숫자에 따른 Month 열거상수 값 가져오기
Month whichMonth = months[month];
month += 1;
//3으로 나눈 정수값 할당
//1년 12달을 계절로 표현하기 위한 계산식
int index = whichMonth.ordinal()/3;
String seasonNow;
String 지금;
switch (index){
case 0:
seasonNow = winter.name();
지금 = 계절.겨울.name();
break;
case 1:
seasonNow = spring.name();
지금 = 계절.봄.name();
break;
case 2:
seasonNow = summer.name();
지금 = 계절.여름.name();
break;
case 3:
seasonNow = autumn.name();
지금 = 계절.가을.name();
break;
default:
seasonNow = winter.name();
지금 = 계절.겨울.name();
}
System.out.printf("이번달은 %d월이구요. %s(%s)입니다", month, 지금, seasonNow);
}
실행결과
이번달은 7월이구요. 여름(SUMMER)입니다
'프로그래밍 > Java' 카테고리의 다른 글
[Java] 배열 자르기 (0) | 2022.10.30 |
---|---|
[Java] scan.next() 와 scan.nextLine의 차이 (0) | 2022.04.14 |
[Java] 문자열 배열에 저장하기 (1) | 2021.11.28 |
[Java] replace()와 replaceAll() (0) | 2021.11.25 |
[Java]제네릭 (0) | 2021.04.28 |