반응형
개요
Enum은 열거형 데이터 타입이다.
데이터가 몇가지 한정된 값(주로 상수들)만을 갖는 형태로 구성되는 경우 서로 관련된 상수들을 하나의 타입으로 정의하는 특수한 클래스이다.
타입 안정성(type safety)을 보장하고, 코드 가독성을 높이며, 에러 방지에 유용하다.
자바의 enum은 클래스와 유사하여, 필드, 메서드, 생성자를 가질 수 있다.
enum 기본 사용법
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println(today);
System.out.println(today instanceof Enum);
System.out.println(today instanceof Object);
}
}
값을 print해보면 today에 할당한 값과 Enum, Object타입인지 확인 시 true가 출력되는 것을 볼 수 있다.
Enum타입은 클래스와 동일하게 선언하며 할당될 수 있는 값은 enum 상수와 null로 한정된다.
enum의 주요 메서드
메서드 | 설명 |
values() | 모든 열거 상수를 배열로 반환 |
valueOf(String s) | 문자열과 일치하는 상수를 반환 (없으면 예외 발생) |
ordinal() | 상수의 순서(인덱스)를 반환 (0부터 시작) |
name() | 상수의 이름(문자열)을 반환 |
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
Day day = Day.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
System.out.println(day.ordinal()); // 4 (0부터 시작)
System.out.println(Day.valueOf("MONDAY")); // Day.MONDAY
for (Day d : Day.values()) System.out.print(d + " ");
}
}
필드와 메서드 추가
enum은 생성자, 필드, 메서드를 가질 수 있다.
enum Level {
HIGH(3), MEDIUM(2), LOW(1);
private final int value;
Level(int value) { // 생성자
this.value = value;
}
public int getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Level level = Level.HIGH;
System.out.println(level + "의 값: " + level.getValue()); // HIGH의 값: 3
level = Level.MEDIUM;
System.out.println(level + "의 값: " + level.getValue()); // MEDIUM의 값: 2
level = Level.LOW;
System.out.println(level + "의 값: " + level.getValue()); // LOW의 값: 1
}
}
- 각 상수에 고유한 값을 부여할 수 있다.
- 생성자는 private(또는 default)만 가능하며, 열거 상수 뒤에 필드 값을 괄호로 전달한다.
switch 문에서의 사용
enum은 switch문에서 자주 사용된다.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
Day today = Day.WEDNESDAY;
switch (today) {
case MONDAY -> System.out.println("월요일");
case TUESDAY -> System.out.println("화요일");
case WEDNESDAY -> System.out.println("수요일");
case THURSDAY, FRIDAY -> System.out.println("주말이 다가온다.");
default -> System.out.println("주말입니다.");
}
}
}
switch에서 enum을 사용할 경우, 문자열과 비교하는 것보다 빠르고 안전하다.
싱글톤 패턴
enum은 싱글톤(Singleton) 패턴처럼 동작한다.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
private String message;
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
public class Main {
public static void main(String[] args) {
Day today = Day.WEDNESDAY;
today.setMessage("Today is " + today);
System.out.println(today.getMessage());
today = Day.FRIDAY;
System.out.println(today.getMessage());
today = Day.WEDNESDAY;
System.out.println(today.getMessage());
}
}
- Day.WEDNESDAY에 setMessage()를 호출하면 WEDNESDAY라는 하나의 객체의 필드가 변경된다.
- 이후에 Day.WEDNESDAY를 다시 사용해도 동일한 객체이므로, 이전에 설정한 message 값이 그대로 유지된다.
- Day.FRIDAY엔 setMessage를 통해 값을 할당하지 않았으므로 null이 출력된다.
인터페이스 구현
enum은 인터페이스를 구현할 수 있다.
interface Printable {
void print();
}
enum Status implements Printable {
SUCCESS {
public void print() {
System.out.println("성공!");
}
},
ERROR {
public void print() {
System.out.println("에러 발생!");
}
};
}
public class Main {
public static void main(String[] args) {
Status.SUCCESS.print(); // 성공!
Status.ERROR.print(); // 에러 발생!
}
}
인터페이스 Printable을 Enum Status에서 상속받는다.
각 값마다 다른 형식의 print함수를 오버라이딩 했다.
728x90
반응형
'웹(WEB) > 자바(Java)' 카테고리의 다른 글
[Java] 자바 자료구조, Collection (0) | 2024.12.31 |
---|---|
[Java] 자바 annotation (0) | 2024.12.31 |
[Java] 자바 Generics (0) | 2024.12.30 |
[Java] 자바 인터페이스 (0) | 2024.12.30 |
[Java] 자바 Object 클래스 (0) | 2024.12.30 |