1. ENUM 이 도입된 이유
1.1 String 사용 시 타입 안정성 부족 문제
- 값의 제한 부족: 오타나 잘못된 문자열을 입력할 가능성이 있다.
- 컴파일 시 오류 감지 불가: 런타임에서만 문제가 발견되기 때문에 디버깅이 어려워질 수 있다.
1.2 상수 사용 시 안정성은 높아지나 여전히 String 자체를 막을 수 없음.
1.3 타입 안전 열거형 패턴 (Type-Safe Enum pattern)
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
//private 생성자 추가
private ClassGrade() {}
}
장점
- 타입 안정성 향상: 정해진 객체만 사용할 수 있어 잘못된 값을 컴파일 시점에 방지할 수 있다.
- 데이터 일관성: 정해진 객체만 사용하므로 데이터 일관성 보장
단점
- 이 패턴을 구현하려면 추가 코드와 private 생성자를 추가하는 등 유의해야하는 부분이 필요함
1.4 열거형 - Enum Type
- 열거은 toString() 을 재정의 하기 때문에 참조값을 직접 확인할 수 없다.
- 열거형도 클래스다.
- 외부 생성 불가
- static import를 사용하면 더 보기 좋
장점
- 타입 안정성 향상: 사전에 정의된 상수로만 구성되므로, 유효하지 않은 값이 입력될 가능성 X → 컴파일 오류 발생
- 간결성 및 일관성
- 확장성: 새로운 상수를 ENUM에 추가하기만 하면 됨.
2. 열거형 주요 메서드
public static void main(String[] args) {
//모든 ENUM 반환
Grade[] values = Grade.values();
System.out.println("values = " + Arrays.toString(values));
for (Grade value : values) {
System.out.println("name=" + value.name() + ", ordinal= " + value.ordinal());
}
//String -> ENUM 변환, 잘못된 문자면 IllegalArgumentException 발생
String input = "GOLD";
Grade gold = Grade.valueOf(input);
System.out.println("gold = " + gold); //toString() 오버라이딩 가능
}
실행 결과
values = [BASIC, GOLD]
name=BASIC, ordinal= 0
name=GOLD, ordinal= 1
gold = GOLD
- values(): 모든 ENUM 상수를 포함하는 배열을 반환한다.
- valueOf(String name): 주어진 이름과 일치하는 ENUM 상수를 반환한다.
- name(): ENUM 상수의 이름을 문자열로 반환한다.
- ordinal(): ENUM 상수의 선언 순서대로 0부터 반환한다. (중간에 상수 선언 위치가 변경되면 전체 상수 위치가 변경될 수 있으므로 사용을 지양 !)
- toString(): ENUM 상수의 이름을 문자열로 반환한다. name()과 유사하지만, toString()은 직접 오버라이딩 가능
열거형 정리
- 열거형은 java.lang.Enum를 자동(강제) 상속 받는다.
- 열거형은 이미 java.lang.Enum을 상속받았기 때문에 다른 클래스를 추가로 상속받을 수 없다.
- 열거형은 인터페이스를 구현할 수 있다.
- 열거형에 추상 메서드르 선언하고, 구현할 수 있다. (이 경우 익명 클래스와 같은 방식을 사용)
package enumeration.ref2;
public enum Grade {
BASIC(10), GOLD(20), DIAMOND(30);
private final int discountPercent;
Grade(int discountPercent) {
this.discountPercent = discountPercent;
}
public int getDiscountPercent() {
return discountPercent;
}
}
- discountPercent 필드를 추가하고, 생성자를 통해서 필드에 값을 저장한다.
- 열거형은 상수로 지정하는 것 외에 일반적인 방법으로 생성이 불가능하다. 따라서 생성자에 접근제어자를 선언할 수 없게 막혀있다. (private)
- BASIC(10)과 같이 상수 마지막에 괄호를 열고 생성자에 맞는 인수를 전달하면 적절한 생성자가 호출된다.
- 값을 조회하기 위해 getDiscountPercent() 메서드를 추가했다. 열거형도 클래스이므로 메서드를 추가할 수 있다.
출처 - 김영한의 실전 자바 중급 1편
'Backend > Java' 카테고리의 다른 글
중첩 클래스, 내부 클래스 (0) | 2024.08.11 |
---|---|
날짜와 시간 (0) | 2024.08.10 |
Class, System 클래스 (0) | 2024.08.08 |
래퍼 클래스 (0) | 2024.08.08 |
String 클래스 (0) | 2024.08.07 |