JAVA
Enum
devstep88
2023. 8. 23. 15:18
자바의 Enum은 Enumeration의 약자로 JDK 5부터 지원되는 기능이다.
Enum 사용하기
- 클래스를 생성하는 방식처럼 Enum을 생성한다.
- Enum 안에 상수를 나타내는 값을 적는다. 상수와 상수는 콤마(,)로 구분한다.
Enum의 특징
- Enum은 타입에 대해 안전하다. 미리 정의된 Enum 변수 안의 상수만을 대입할 수 있다.
Day day = Day.SUNDAY;
위와 같은 코드는 되지만
Day day = 5;
위와 같은 코드는 되지 않는다.
- Enum은 switch문에서 사용 가능하다.
- JDK 7부터 switch문에서 String도 사용 가능하다.
public class DaySwitchTest {
public static void main(String[] args) {
Day day = Day.SUNDAY;
switch (day){
case SUNDAY:
System.out.println("일요일입니다.");
break;
case MONDAY:
System.out.println("월요일입니다.");
break;
default:
System.out.println("그 밖의 요일");
}
}
}
- day가 어떤 상수냐에 따라서 알맞은 case부분이 실행된다.
- 이 때 조심할 것은 case 다음에는 Day가 가지고 있는 상수의 이름이 나와야 한다는 것이다.
- case 다음에 Day.SUNDAY라고 사용하면 컴파일 에러 발생한다.
Enum 타입의 특징
- Enum은 생성자를 가질 수 있다. 단, 생성자는 private해야 한다.
- Enum의 생성자는 내부에서만 호출이 가능하다.
public enum Gender {
MALE("XY"),
FEMALE("XX");
private String chromosome; // 염색체
private Gender(String chromosome){
this.chromosome = chromosome;
}
Enum의 메소드, 변수 선언하기
- Enum안에 선언된 메소드나 변수를 가질 수 있다.
- 또한 Object가 가지고 있는 메소드를 오버라이딩 할 수도 있다.
Enum 값끼리 비교시에는 == 를 사용한다.
- ==를 이용해서 Enum타입으로 초기화된 변수를 비교할 수 있다.
Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
if(day1 == day2){
System.out.println("같은 요일입니다.")
}
EnumMap
- Enum타입을 키(Key)로 사용할 수 있도록 해주는 클래스이다.
import java.util.EnumMap;
public class EnumMapTest {
public static void main(String[] args) {
EnumMap emap = new EnumMap(Day.class);
emap.put(Day.SUNDAY, "일요일은 잠이 최고!!");
emap.put(Day.MONDAY, "월요병임");
emap.put(Day.FRIDAY, "야호 불금!!");
System.out.println(emap.get(Day.MONDAY));
}
}
EnumSet
- Enum 상수를 Set자료구조로 다루기 위한 유용한 메소드를 제공하는 클래스이다.
import java.util.EnumSet;
import java.util.Iterator;
public class EnumSetTest {
public static void main(String[] args) {
EnumSet eset = EnumSet.allOf(Day.class);
Iterator<Day> dayIter = eset.iterator();
while (dayIter.hasNext()){
Day day = dayIter.next();
System.out.println(day);
}
System.out.println("---------------------------------");
EnumSet eset2 = EnumSet.range(Day.MONDAY, Day.WEDNESDAY);
Iterator<Day> dayIter2 = eset2.iterator();
while (dayIter2.hasNext()){
Day day = dayIter2.next();
System.out.println(day);
}
}
}
Enum은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.
public enum Color implements Printer{
RED("FF0000"),
GREEN("00FF00"),
BLUE("0000FF");
private String rgb;
private Color(String rgb){
this.rgb = rgb;
}
@Override
public void print() {
System.out.println("rgb : " + rgb);
}
}
public class ColorTest {
public static void main(String[] args) {
Color color = Color.RED;
color.print();
}
}
Enum은 추상메소드를 가질 수 있다.
추상메소드를 가질 경우에는 상수를 정의할 때 추상메소드를 함께 구현해주어야 한다.
public enum Country {
KOREA{
public void print(){
System.out.println("대한민국");
}
},
JAPAN{
public void print(){
System.out.println("일본");
}
},
USA{
public void print(){
System.out.println("미국");
}
};
public abstract void print();
}
public class CountryTest {
public static void main(String[] args) {
Country country = Country.KOREA;
country.print(); // 대한민국
}
}
그 밖의 특징
- Enum 객체는 Enum 상수가 처음 호출되거나 참조될 때 생성된다.
- Enum은 Serializable 과 Comparable 인터페이스를 이미 구현하고 있다.