1. ENUM의 탄생 이전
열거 타입을 제공하기 이전에는 다음 코드처럼 상수를 사용해 사용하곤 했습니다.
public class Grade {
public static final String BASIC = "BASIC";
public static final String GOLD = "GOLD";
public static final String PLATINUM = "PLATINUM";
}
하지만 약간의 문제가 발생하기 시작하는데 문자열 상수를 사용할 경우 개발자가 실수로 Grade 안에 있는 상수를 사용하지 않고 직접 문자열을 사용해도 막을 방법이 없다는 것이었습니다.
public int discount(String grade, int price)
int vip = discountService.discount("VVIP", 10000);
00개발자 흠 String이네 VIP 가즈아 => 실수로 VVIP로 적는 불상사가...
그리고 사용해야 하는 문자열 상수가 어디에 있는지 해당 메소드 호출하는 개발자가 알기 쉽지 않습니다. => 주석으로 잘 남기거나... 팀원에게 잘 전달하거나 기억력에 의지해야하는 슬픈 상황이 벌어지게 됩니다.
2. 타입 안전 열거형 패턴 등장(Type-Safe Enum Pattern)
위와 같은 문제로 클래스를 사용해 열거형 상수를 정의하는 방법이 등장하게 됩니다.
public class Grade {
public static final Grade BASIC = new Grade();
public static final Grade GOLD = new Grade();
public static final Grade PLATINUM = new Grade();
private Grade(){}
}
public int discount(Grade grade, int price) {
~~~~
}
int vip = discountService.discount(Grade.VIP, 10000);
해당 패턴의 등장으로 1번에서의 문제점을 해결할 수 있었습니다.
장점
- 안정성 향상 : 정해진 객체만 사용해 잘못된 값 입력 방지
- 데이터 일관성 : 정해진 객체만 사용해 일관성이 보장됨
하지만 이 패턴은 여전히 많은 코드를 작성해야하며, private 생성자를 추가하는 등의 유의점이 있습니다.
3. 드디어 Enum Type의 등장
불편함을 이기지 못한 자바 개발자들은 타입 안전 열거형 패턴을 편리하게 사용할 수 있는 열거형을 제공하기 시작합니다.
(enumeration : 일련의 명명된 상수들의 집합)
public enum Grade {
BASIC, GOLD, PLATINUM
}
특징
- 열거형 정의 시 class 대신에 enum을 사용 (열거형을 제공하기 위해 제약이 추가된 클래스이다.)
- 열거형 내부에서 상수로 지정하는 것 이외 직접 생성이 불가능
- 원하는 상수의 이름을 나열
- 열거형에 추상 메서드 선언과 구현이 가능하다.
장점
- 타입 안정성 향상 : 사전 정의된 상수들로 구성되어 유효하지 않은 값이 입력되는 것을 방지
- 간결성 및 일관성 : 코드가 간결해지고 명확해지며 데이터 일관성 보장
- 확장성 : 새로운 등급을 추가하고 싶을 때 ENUM에 새로운 상수를 추가하면 끝
enum의 등장으로 인해 더 간편하게 열거형을 사용할 수 있게 되었습니다.
4. Enum의 메소드
Enum은 java.lang.Enum 클래스를 자동으로 상속 받아 해당 클래스가 제공하는 기능들을 사용할 수 있습니다.
메소드 | 설명 | 리턴타입 |
values | 열거 객체 문자열 리턴 | String |
ordinal() | 열거 객체 순번(0시작) 리턴 | int |
compareTo() | 열거 객체 비교해서 순번 차이 리턴 | int |
valueOf(String name) | 문자열 입력받아 일치하는 Enum 상수 리턴 | enum |
values() | 모든 ENUM 상수 배열로 리턴 | enum[] |
ordinal()은 가급적 사용하지 말자 중간에 상수를 선언하는 위치가 변경되면 전체 상수 위치가 모두 변경 될 수 있기 때문
혹시나 열거 타입 상수와 연결된 정수값이 필요하다면 차라리 인스턴스 필드를 사용하자..
5. 정리
자바의 enum 타입은 관련된 상수들의 집합으로 상수를 보다 안전하고 간결하게 정의할 수 있도록 돕습니다. enum은 타입 안전성을 보장하고 코드의 가독성과 유지 보수성을 향상시킵니다 또한 열거형을 더욱 명확하고 일관성 있게 관리할 수 있습니다.
참고자료
김영한의 실전 자바 - 중급 1편
자바의 정석
'JAVA' 카테고리의 다른 글
[JAVA] Call by Value, Call by Reference (0) | 2024.06.03 |
---|---|
[JAVA] 래퍼 클래스(Wrapper Class)란? (0) | 2024.05.31 |
[JAVA] JVM(Java Virtual Machine) (0) | 2023.07.11 |
[JAVA] String이 불변(immutable)인 이유? (0) | 2023.04.11 |
[JAVA]String, StringBuilder, StringBuffer (0) | 2023.04.08 |