1. Enum
1.1. Enum의 정의
Enum은 "열거형 타입"을 의미하며, Java에서 서로 연관된 상수들의 집합을 정의하기 위해 사용됩니다. Enum은 특정 값들만 가질 수 있도록 제한된 데이터 타입을 제공하여 코드를 간결하게 만듭니다.
- 타입 안정성 제공: Enum은 컴파일 타임에 값이 결정되며, 허용되지 않은 값이 할당되는 것을 방지합니다.
- 상수 그룹화: 관련 있는 상수들을 하나의 타입으로 묶어 표현합니다.
- 객체 지향적 설계: 필드와 메서드를 추가하여 응집도를 높이고, 상수와 관련된 데이터 및 동작을 한곳에 모아 표현할 수 있습니다.
- 간단한 예시
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class EnumExample {
public static void main(String[] args) {
Day today = Day.FRIDAY; // Day 타입만 할당 가능
}
}
- Day는 MONDAY에서 SUNDAY까지 7개의 고정된 값만 가질 수 있는 타입이 됩니다.
- Enum은 class와 유사하지만 변경할 수 없는 상수 집합이라는 점에서 다릅니다.
1.2. Enum 사용목적
1) 코드의 명확성과 가독성 향상
Enum을 사용하면 상수 값의 의미를 명확히 표현할 수 있습니다. 기존에는 상수를 정의하기 위해 static final 상수를 사용했지만, 이는 그룹화가 어려워 관리가 복잡했습니다. Enum은 상수를 하나의 타입으로 묶어주기 때문에, 읽고 이해하기 쉬운 코드를 작성할 수 있습니다.
public class Main {
// Enum 선언
public enum Color {
RED,
GREEN,
BLUE;
}
public static void main(String[] args) {
// 현재 색상을 Enum으로 저장
Color currentColor = Color.RED;
// 색상 출력
switch (currentColor) {
case RED:
System.out.println("The color is Red");
break;
case GREEN:
System.out.println("The color is Green");
break;
case BLUE:
System.out.println("The color is Blue");
break;
default:
System.out.println("Unknown color");
}
}
}
2) 타입 안전성 보장
Enum은 특정 타입으로 제한된 상수 집합을 제공합니다. 잘못된 값(정수, 문자열 등)이 변수에 할당될 위험이 없고, 컴파일 시점에 잘못된 사용을 방지할 수 있습니다.
public class Main {
// Enum 선언
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY;
}
public static void main(String[] args) {
// 현재 요일을 Enum으로 저장
Day today = Day.MONDAY;
// 잘못된 값 할당 방지 (컴파일 오류 발생)
// today = "FRIDAY"; // 오류
// today = 1; // 오류
System.out.println("Today is: " + today);
}
}
3) 확장성과 유지보수 용이
Enum은 상수 외에도 데이터를 포함하거나 메서드를 정의할 수 있어 유연합니다. 새로운 값을 추가하거나 관련 기능을 구현할 때 코드 변경이 쉽습니다.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
public boolean isWeekend() {
return this == SATURDAY || this == SUNDAY; // 주말 여부 확인
}
}
public class EnumExample {
public static void main(String[] args) {
Day today = Day.FRIDAY;
if (today.isWeekend()) {
System.out.println("It's a weekend!");
} else {
System.out.println("It's a weekday.");
}
}
}
2. 기본 문법과 활용
2.1. Enum 클래스 정의
Enum은 enum 키워드를 사용하여 정의하며, 상수는 일반적으로 대문자로 작성합니다.
public class Main {
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println("Today is: " + today); // 출력: Today is: MONDAY
}
}
2.2. Enum과 Switch
Enum은 힙 영역에 단일 객체로 저장되며, Enum 상수는 모두 참조 타입으로 동일한 메모리 주소를 가리키기 때문에 '==' 연산을 사용할 수 있습니다. 이는 switch 문에서 Enum을 비교할 때도 활용됩니다.
public class Main {
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static void main(String[] args) {
Day today = Day.MONDAY;
switch (today) {
case Day.MONDAY:
System.out.println("Start of the work week.");
break;
case Day.FRIDAY:
System.out.println("It's almost the weekend!");
break;
case Day.SATURDAY:
case Day.SUNDAY:
System.out.println("It's the weekend. Relax!");
break;
default:
System.out.println("Midweek hustle.");
}
}
}
2.3. Enum에서 정의된 메소드들
1) name
- 기능: 열거 객체의 이름(문자열)을 반환합니다.
- 리턴 타입: String
public enum Color {
RED, GREEN, BLUE
}
public class Main {
public static void main(String[] args) {
Color color = Color.RED;
System.out.println(color.name()); // 출력: RED
}
}
2. ordinal
- 기능: 열거 객체의 선언 순서를 반환합니다(0부터 시작).
- 리턴 타입: int
public enum Color {
RED, GREEN, BLUE
}
public class Main {
public static void main(String[] args) {
Color color = Color.GREEN;
System.out.println(color.ordinal()); // 출력: 1
}
}
3. compareTo()
- 기능: 열거 객체의 순서를 비교하여 차이를 반환합니다.
- 리턴 타입: int
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
public class Main {
public static void main(String[] args) {
Day day1 = Day.MONDAY;
Day day2 = Day.WEDNESDAY;
System.out.println(day1.compareTo(day2)); // 출력: -2 (MONDAY - WEDNESDAY)
}
}
4. valueOf(String name)
- 기능: 문자열을 입력받아 해당 이름의 열거 객체를 반환합니다. (대소문자 구분)
- 리턴 타입: enum
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
public class Main {
public static void main(String[] args) {
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 출력: MONDAY
}
}
5. values()
- 기능: 모든 열거 객체를 배열로 반환합니다.
- 리턴 타입: enum[]
public enum Color {
RED, GREEN, BLUE
}
public class Main {
public static void main(String[] args) {
for (Color color : Color.values()) {
System.out.println(color);
}
// 출력:
// RED
// GREEN
// BLUE
}
}
3. Enum 활용
4.1. Enum 생성자
Enum을 활용하여 특정 값이나 연관된 데이터와 매핑할 수 있습니다. enum을 매핑할 때에는 Map을 사용하여 매핑 관계를 관리하거나, enum 자체에 추가적인 메서드를 정의하여 처리할 수 있습니다.
public enum Day {
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);
private final int dayNumber;
// 생성자
Day(int dayNumber) {
this.dayNumber = dayNumber;
}
// Getter 메서드
public int getDayNumber() {
return dayNumber;
}
}
public class Main {
public static void main(String[] args) {
// Enum을 사용하여 숫자와 요일을 매핑
Day day = Day.WEDNESDAY;
System.out.println("The day number of " + day + " is: " + day.getDayNumber());
}
}
위와 같이 사용할 수 있는 이유는 enum은 각 상수마다 고유한 인스턴스를 생성하여 자동으로 public static final로 관리됩니다. 이로 인해 상수 값들이 자신의 인스턴스를 생성하고, 매핑을 통해 고유한 데이터를 다룰 수 있습니다.
//Enum 쓰기 전
public class Day {
public static final Day MONDAY = new Day(1);
public static final Day TUESDAY = new Day(2);
public static final Day WEDNESDAY = new Day(3);
public static final Day THURSDAY = new Day(4);
public static final Day FRIDAY = new Day(5);
public static final Day SATURDAY = new Day(6);
public static final Day SUNDAY = new Day(7);
private final int dayNumber;
// 생성자
private Day(int dayNumber) {
this.dayNumber = dayNumber;
}
// Getter 메서드
public int getDayNumber() {
return dayNumber;
}
}
Enum 생성자에는 여러 개의 값을 매핑할 수 있습니다.
public enum Day {
MONDAY(1, "Start of the week", "Workday"),
TUESDAY(2, "Second day", "Workday"),
WEDNESDAY(3, "Mid week", "Workday"),
THURSDAY(4, "Almost weekend", "Workday"),
FRIDAY(5, "Last workday", "Workday"),
SATURDAY(6, "Weekend", "Rest"),
SUNDAY(7, "End of the week", "Rest");
private final int dayNumber;
private final String description;
private final String type;
// 생성자
Day(int dayNumber, String description, String type) {
this.dayNumber = dayNumber;
this.description = description;
this.type = type;
}
// Getter 메서드
public int getDayNumber() {
return dayNumber;
}
public String getDescription() {
return description;
}
public String getType() {
return type;
}
}
public class Main {
public static void main(String[] args) {
// 예시: WEDNESDAY에 대해 여러 정보 출력
Day day = Day.WEDNESDAY;
System.out.println(day + ": " + day.getDayNumber() + ", " + day.getDescription() + ", " + day.getType());
}
}
https://techblog.woowahan.com/2527
Java Enum 활용기 | 우아한형제들 기술블로그
안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 Enum에 관해
techblog.woowahan.com
'컴퓨터 > JAVA' 카테고리의 다른 글
JPA - 영속성 컨텍스트(Persistence Context) (0) | 2024.11.23 |
---|---|
JAVA - 일급 컬렉션(First-Class Collection) (0) | 2024.10.31 |
JUnit5 기초 (0) | 2024.10.24 |
객체지향 - SOLID(객체 지향 설계) (0) | 2024.10.05 |
JAVA - Generic(제너릭) (0) | 2024.09.30 |