티스토리 뷰
열거형은 자바 1.5 버전부터 추가된 것으로 관련이 있는 상수들의 집합으로 enum사용 시 다음과 같은 장점이 있습니다.
- 코드가 단순해진다,
- 가독성이 좋아진다.
- 상수값의 타입 안전성이 보장된다.
- 컴파일 시점에 체크, 인스턴스 생성과 상속 방지
1. 사용 방법
- Class처럼 사용 : enum
- Class 내부에 enum 사용 : 내부 class처럼
- enum의 생성자는 private
관련 Method|
- valueOf(String) : String값을 enum에서 가져옴
- valueOf(Class String) : 전달된 문자열과 일치하는 해당 열거체의 상수를 반환
- values() : enum의 요소들을 순서대로 enum타입의 배열로 리턴
-> 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환
- ordinal : 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환
2. 선언 및 사용
문법 : enum 열거체 이름 { 상수 1 이름, 상수 2 이름,... }
2-1. Class Type
public enum ClassTypeEnum {
NAC, SUS, RSP, CAN
}
public static void main(String [] args) {
// 열거형에 있는 요소 전체 참조
ClassTypeEnum[] enumValues = ClassTypeEnum.values();
Arrays.stream(enumValues). forEach(classTypeEnum -> System.out.println(classTypeEnum));
// 결과 : NAC SUS, RSP, CAN
// 요소 검사
String compValue = "NAC";
if ( Arrays.stream(enumValues)
. anyMatch(classTypeEnum -> compValue.equals(String.valueOf(classTypeEnum))) ) {
System.out.print(compValue + " 는 존재합니다.");
} else {
System.out.print(compValue + " 는 존재하지 않습니다..");
}
// 결과 : NAC는 존재합니다
}
2-2. Inner Class Type
public class InnerClassTypeEnum {
public enum EventCode {
NAC, SUS, RSP, CAN
}
}
public static void main(String [] args) {
InnerClassTypeEnum.EventCode [] eventCode = InnerClassTypeEnum.EventCode.values();
Arrays.stream(eventCode). forEach(code -> System.out.println(code));
}
// 결과 : NAC SUS, RSP, CAN
3. Enum 원리
- InnerClassType Class에 Method로 EventNum이 enum Type으로 선언되어 있다.
- InnerClassTypeEnum.EventNm enum Type은 생성시점에 static로 생성이 된다.
- InnerClassTypeEnum.EventNm의 static 요소는 각각 객체로 배열로 담겨 있습니다. - InnerClassTypeEnum.EventNm.valueOf("SUS")를 사용하면 InnerClassTypeEnum.EventNm의 요소 중 SUS에 해당하는 객체를 반환하게 됩니다.
- eventNm.getEventNm() 사용하면 일시정지가 표시됩니다.
4. If문 대용 ( 코드 단순, 가독성 )
여러 조건이 만족하는 IF문과IF 같은 곳에서 코드가 단순해지며,, 가독성이 좋아지며,, 코드의 추가 시 업무 로직의 변경 없이 Enum 객체만 수정하면 되므로 유지보수 입장에서 보면 효과적이다.
4-1. 기존 If 문
// 다음과 같이 상수로 선언되어 있음
public static final String SVC_PRC_TYPE_CYB = "CYB"; // Mylgt
public static final String SVC_PRC_TYPE_MOB = "MOB"; // 모바일고객센터
public static final String SVC_PRC_TYPE_FCG = "FCG"; // FCG
public static final String SVC_PRC_TYPE_ARS = "ARS"; // ARS
public static final String SVC_PRC_TYPE_CAS = "CAS"; // CAS
public static final String SVC_PRC_TYPE_VPM = "VPM"; // 음성 비화 등록 화면
public static final String SVC_PRC_TYPE_DEV = "DEV"; // 기기변경
public static final String SVC_PRC_TYPE_DOC = "DOC"; // 개통서류
// 업무 로직
If (SVC_PRC_TYPE_CYB.equals(prcType) ||
SVC_PRC_TYPE_ CAS.equals(prcType) ||
SVC_PRC_TYPE_ ARS.equals(prcType) ||
SVC_PRC_TYPE_ PPS.equals(prcType) ||
SVC_PRC_TYPE_ FCG.equals(prcType) ||
SVC_PRC_TYPE_ MNT.equals(prcType) {
// 업무 로직
}
4-2. enum 사용
public static enum ONLINE_RUNDTTM_PRCTYPE {
CYB, CAS, ARS, PPS, FCG, MNT;
}
If (Arrays.stream(SvcCodeVal.ONLINE_RUNDTTM_PRCTYPE.values()). anyMatch(items ->
String.valueOf(items). equals(prcType))) {
// 업무 로직
}
5. 열거형 상수에 불규칙적인 값 사용
enum InputChannel {
CYB(100),
MOB(200),
FCG(300),
ARS(400);
private final int value;
InputChannel(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
public static void main(String [] args) {
System.out.println(InputChannel.MOB.ordinal()); // 2
System.out.println(InputChannelMOB.getValue()); // 200
}
6. enum에서 서비스 호출
추상화를 사용해야 한다
public interface EnumService {
String service1(String code);
String service2(String code);
}
@Service
class EnumServiceImpl implements EnumService {
@Override
public String service1(String code) {
return "\nservice1:: service1";
}
@Override
public String service2(String code) {
return "\nservice2:: service2";
}
}
--------------------------------------------------------------------------------------------------------------------------
public enum EventServcie {
NAC {
String handleTask(EnumService service, String code) {
return service.service1(code);
}
},
SUS {
String handleTask(EnumService service, String code) {
return service.service1(code);
}
};
abstract String handleTask(EnumService service, String code);
}
---------------------------------------------------------------------------------------------------------------------------
// 사용
EnumService service = new EnumServiceImpl();
InnerClassTypeEnum.EventServcie eventServcie = InnerClassTypeEnum.EventServcie.valueOf("NAC");
String vv = eventServcie.handleTask(service, "NAC");
System.out.print(vv); // service1:: service1
참고
https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html
Enum (Java Platform SE 8 )
Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.) Note that for a particular enum typ
docs.oracle.com
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
Enum Types (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
http://www.javapractices.com/topic/TopicAction.do?Id=1
Java Practices->Type Safe Enumerations
Type Safe Enumerations Enumerations are sets of closely related items, for example: cardinal directions - north, south, east, west types of novels - mystery, classic, fantasy, romance, science-fiction flavours of ice cream - chocolate, vanilla, raspberry,
www.javapractices.com
'프로그램이야기' 카테고리의 다른 글
5. 람다 이야기 1 (0) | 2022.06.02 |
---|---|
4. 동작파라미터 2 (Behavior Parameterization) (0) | 2022.06.01 |
3. 동작 파라미터 1 - 일급객체 (0) | 2022.06.01 |
2. 불변값, 가변값은 무엇을 의미 할까 ? (0) | 2022.03.17 |
1. 프로그램 배우기에 앞서 (0) | 2022.03.11 |