오늘은 Java Enum 클래스에 대해 알아보려 합니다. SpringBoot를 배우면서 자연스럽게 Enum 클래스를 접하게 되었습니다. 실무에서 흔히 final static string을 사용해서 상수를 정의합니다. 하지만 이렇게 정의해서 코딩하는 경우 여러 문제를 야기시킵니다. 그래서 JDK 1.5 버전부터 새롭게 추가된 것이 Enum class입니다.
Enum Class
정의📖
C언어와 C++에서는 열거체(enumeration type)를 사용할 수 있지만, JDK 1.5 이전의 자바에서는 열거체를 사용할 수 없었습니다. 하지만 JDK 1.5 이후부터는 C언어의 열거체보다 더욱 향상된 성능의 열거체를 정의한 Enum 클래스를 사용할 수 있게 되었습니다.
Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미합니다. 앞서 언급한 바와 같이 기존에 상수를 정의하는 방법이었던 final static String과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있게 되었습니다.
예제😃
특징과 장점을 나열했을 때, 정확하게 이해가 되긴 어려워 보여서 예제를 먼저 보고 어느 정도 이해를 먼저 하는 게 좋을 것 같습니다. 이번에 간단한 게시판 토이 프로젝트를 만들면서 사용했던 enum 클래스입니다.
@Getter
@RequiredArgsConstructor
public enum Role {
GUEST("ROLE_GUEST", "손님"),
USER("ROLE_USER", "일반 사용자");
private final String key;
private final String title;
}
상당히 직관적이어서 가독성이 좋습니다. Role(권한)은 GUEST(손님)과 USER(일반 사용자)로 나뉘고, 해당 권한마다 프로그램 내에서 동작할 수 있는 기능들이 다를 것 같다는 자연스러운 유추가 가능합니다. 하지만 일반적으로 사용했던 코드 또한 직관적인 건 매한가지입니다.
private static String ROLE_GUEST = "손님"
private static String ROLE_USER = "일반 사용자"
서로 선언하는 방식만 다를 뿐 문제가 크게 없어 보입니다. 하지만 추후에 프로그램이 복잡해지면서 사용자에게 권한을 부여할 때, ROLE_GUEST, ROLE_USER가 아닌 다른 상수 값이 할당될 때 큰 문제를 야기시킵니다.
public class Role {
private static String ROLE_GUEST = "손님"
private static String ROLE_USER = "일반 사용자"
public static void main(String[] args){
String role;
role = Role.ROLE_GUEST;
role = Role.ROLE.USER;
// 여기까지는 문제가 되지 않습니다. 그런데 프로그램이 복잡해져서 다른 값이 들어간다고 가정하면?
role = "전혀 관련없는 값";
}
}
프로그램 입장에서는 String으로만 들어오면 문제가 안된다고 판단하기 때문에, 우리가 기대하는 상수값인 손님과 일반 사용자가 할당이 되었는지 안되었는지에 대한 로직도 추가되어야 하는 상황이 발생하게 됩니다.
if(role != "손님" && role != "일반 사용자"...){
...
}
쉽게 말해서 잠재적인 문제를 초기에 바로잡겠다! 그렇기에 상수의 선언은 Enum클래스를 이용하겠다!라고 생각하시면 될 것 같습니다.
Enum의 특징
- Enum은 DB의 코드 값이랑 많이 활용될 수 있습니다.
- 접근 사용자가 권한의 가능 여부를 판단하는 기능을 메서드 추가를 통해 해소할 수 있다(상수 관련 연계 및 연산 처리)
- Enum의 Enum을 사용하여, 권한의 권한으로 ROLE_GUEST, ROLE_USER에 해당하는 권한만 존재하는 Enum을 생성할 수 있다.
Enum의 장점
- 코드가 단순해지며, 가독성이 좋다.
- 인스턴스 생성과 상속을 방지하여 상수값의 타입 안정성이 보장된다.
- enum class를 사용해 새로운 상수들의 타입을 정의함으로써 정의한 타입 이외의 타입을 가지면, 데이터 값을 컴파일 시 체크한다.
- 키워드(enum)를 사용하기 때문에 구현 의도가 열거임을 분명하게 알 수 있다.
Enum의 메서드
Method | Description |
static E values() | 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환한다 |
static E valueOf(String name) | 전달된 문자열과 일치하는 해당 열거체의 상수를 반환한다 |
protected void finalize() | 해당 Enum 클래스가 final 메서드를 가질 수 없게 된다 |
String name() | 해당 열거체 상수의 이름을 반환한다 |
int ordinal() | 해당 열거체 상수가 열거체 정의에서 정의된 순서를 반환한다(0부터 시작) |
compareTo(E o) | enum과 지정된 객체의 순서를 비교한다. 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수를 리턴한다 |
equals(Object other) | 지정된 객체가 enum 정수와 같은 경우 true를 리턴한다 |
👨👩👦👦 오픈채팅방 운영
취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁
참여코드 : 456456
https://open.kakao.com/o/gVHZP8dg
👨💻 전자책 출간
아울러 제가 🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁
마치며
지금까지 Java Enum 클래스에 대해 알아보았습니다. 아직 공부 중인 단계라 완벽한 예제를 만들기가 쉽지 않네요.. 혹여나 조금 더 깊게 이해하고 싶으시다면 하단에 제가 참고했던 포스팅 링크를 걸어놓았으니 참고하시면 될 것 같습니다.
JAVA 관련 포스팅
* [ 객체 지향 프로그래밍(OOP)이란? ]
* [ 추상 클래스 VS 인터페이스 ]
* [ JPA 영속성 컨텍스트 핵심요약 ]
* [ JPA의 정의와 장 ·단점 ]
참고 포스팅
'TIL' 카테고리의 다른 글
TDD 정의 및 암호 검사기 예시 (0) | 2022.05.25 |
---|---|
Java MVC 패턴 바로 알기 (1) | 2022.05.20 |
Java 추상 클래스와 인터페이스 구분 (0) | 2022.05.18 |
객체 지향 프로그래밍(OOP)이란? (0) | 2022.05.16 |
JPA 영속성 컨텍스트 정의 및 핵심요약 (0) | 2022.05.12 |