열거타입(enum)이란
enum 타입은 몇가지 상수의 집합을 정의하는 타입으로 클래스의 특수한 형태이다.
집합이 갖는 값이 한정되어있고 다른 값이 허용되지 않는 경우에 사용한다.
- 사계절 : 봄, 여름, 가을, 겨울
- 요일 : 월, 화, 수, 목, 금, 토, 일
- 성별 : 남성, 여성
열거 타입 선언
이클립스, 혹은 인텔리제이에서 enum 생성시 종류를 선택할 수 있다.
열거 상수는 보통 대문자로 작성한다. 변경될 수 없는 값이라는 것을 알리기 위한 것으로 보인다.
계절 종류를 값으로 하는 Season enum 생성
enum Season(){
SPRING,
SUMMER,
AUTUMN,
WINTER
}
열거 타입 변수
열거형타입 사용해서 변수 선언하기
public class SeasonTest {
//열거타입으로 변수 선언하기
Season season2021;
//열거상수 값 할당하기
//열거상수는 단독으로 사용할 수 없다. 앞에 "열거타입." 이 붙어야 한다
Season summer2021 = Season.SUMMER;
//null 값 할당도 가능하다
Season summer2022 = null;
}
열거타입 변수에 저장되는 값은 참조변수로서 stack 영역에 주소값이 생성된다. 이 때 열거타입 변수의 주소값은 열거상수의 주소값과 동일하다. 같은 영역을 참조하기 때문에 동일한 값을 가질 수 있다. 열거상수의 값이 변경되는경우 같은 주소값을 참조하는 열거변수의 값도 변경된다.
Example
- 열거타입 Season 의 열거상수 SUMMER는 스택영역 101에 위치해있고 주소값 777을 참조
- 열거타입 변수 summer2021은 스택영역 102에 위치해있고, 주소값 777을 참조
주요 메서드
메서드 | 내용 |
boolean equals(Object other) | 열거상수와의 동등성 비교 |
String name() | 열거상수 값 리턴 |
int ordinal() | 열거값에서 몇번째에 해당하는지 리턴 |
static T valueOf(String name) | 열거 객체 리턴 |
values() | 모든 열거객체들을 배열로 리턴 |
코드 예제
열거타입의 Season
public enum Season {
SPING,
SUMMER,
AUTUMN,
WINTER
}
열거타입의 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] 스레드(Thread) 제어하기 - 우선순위 설정, 동기화, 메서드 사용하기 (0) | 2021.07.08 |
---|---|
[Java] 스레드(Thread) - 스레드 개념 및 생성하기 (0) | 2021.07.07 |
[Java] 자바 final 키워드의 사용 (0) | 2021.06.30 |
[Java] 타입문제예방하기101 - 제네릭(Generic) 이란 (0) | 2021.06.30 |
[Java] 타입변환(type casting) - 자동타입변환, 강제타입변환 (0) | 2021.06.30 |