목차
개요
enum은 기존 방식의 한계를 보완하고자 만들어졌다. 기존 방식과 enum은 얼마나 다른지 확인해보자.
enum 탄생 배경
Java의 enum은 서로 관련 있는 상수들의 집합을 정의할 때 사용하는 특수한 데이터 타입이다. enum을 사용 하기 전에는 String을 이용하였다. 하지만 이 기존 방식은 타입 안전성 부족 등 여러 단점이 있다. 이러한 한계를 보완하기 위해 enum을 사용하게 되었다.
문자열 방식 vs enum 방식 비교
옛날 방식 : 문자열 방식
public int Day(String day) {
if(day.equals(MONDAY)) System.out.println("월요일");
else if (day.equals(TUESDAY)) System.out.println("화요일");
//...
else System.out.println("잘못된 요일입니다.");
}
단점 :
- 매개 변수를 넘겨줄 때, 오타가 발생하기 쉽다. (ex. monnday → 월요일 출력을 기대했지만, "잘못된 요일"이라고 출력)
- 타입 안전성 부족 (String이라면 어떤 값이든 들어갈 수 있다. 컴파일 오류로 잡히지 않아 디버깅이 어렵다.)
enum 방식
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
if (Day.MONDAY) System.out.println("월요일");
else if (Day.TUESDAY) System.out.println("화요일");
// ...
장점:
- enum은 static이므로, 어디서든 그냥 사용할 수 있다.
- 값을 enum의 Type으로 제한해주어 타입 안전성을 제공한다. (enum 값 외에는 들어갈 수 없다. 컴파일러가 잡아준다.)
- 관련 메서드나 필드를 함께 정의할 수 있다.
이처럼 enum은 단순한 숫자 집합을 넘어서, 객체지향적인 표현이 가능한 구조이다.
Java enum의 주요 특징
타입 안전성(Type Safety)
enum은 정의된 값 외에는 사용할 수 없기 때문에, 잘못된 값이 들어가는 것을 원천적으로 막는다.
내장 메서드
- values() : 모든 enum 값을 배열로 반환한다.
- valueOf(String name) : 이름에 해당하는 enum 반환한다.
- name() : 열거형 상수의 이름 반환한다.
- ordinal() : 선언된 순서(0부터 시작) 반환한다.
switch 문과 함께 사용 가능
switch(day) {
case MONDAY:
System.out.println("월요일입니다");
break;
}
타입 안전 열거형 패턴이 적용된 클래스
타입 안전 열거형 패턴을 발전시켜 enum이 탄생한 것이다.
public class Day {
public static final Day MONDAY = new Day();
public static final Day TURESDAY = new Day();
// ...
private Week() {}
}
- private 생성자를 사용해서 외부에서 `Day` 클래스를 생성하지 못하도록 하였다.
- `Day` 클래스 내부에서만 `Day` 인스턴스를 생성할 수 있다.
- 따라서 `Day` 클래스 내부에 정의한 상수만 사용해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
enum 활용 예제
필드와 생성자 사용 예시
public enum Grade {
BASIC(0), SILVER(1000), GOLD(5000);
private final int point;
Grade(int point) {
this.point = point;
}
public int getPoint() {
return point;
}
}
- 생성자를 통해 값을 고유의 값을 할당해줄 수 있다.
정리 : enum의 이점
Java의 enum은 단순히 상수를 나열하는 기능을 넘어, 안정성, 가독성, 확장성, 객체지향적 설계 등 다양한 장점을 제공합니다.
기존의 상수 정의 방식보다 훨씬 강력하고 실용적인 도구로, 자바 개발에서 자주 활용되는 요소 중 하나입니다.
enum을 적극적으로 활용하면 더 깔끔하고 견고한 코드를 작성할 수 있습니다.
'JAVA' 카테고리의 다른 글
[Java] Optional (0) | 2025.05.04 |
---|---|
[Java] 동등성과 동일성 (0) | 2025.05.04 |
[Java] Lv_4 도서관 프로젝트 (0) | 2025.05.02 |
[Java] Lv_3 도서관 프로젝트 (0) | 2025.05.02 |
[Java] Lv_2 도서관 프로젝트 (0) | 2025.05.01 |