Enum Class란?
열거형이라고 부르며, 서로 연관된 상수들의 집합을 의미한다. 기존에 상수를 정의할때는 final static String과 같은 문자열이나 숫자로 나타냈었는데, enum을 사용하면 보다 코드의 가독성을 높힐 수 있다.
그렇다면 enum을 쓰게 되면 우리가 얻을 수 있는건 무엇일까?
1. 코드가 단순해지고, 가독성이 좋아진다.
2. 인스턴스의 생성과 상속을 방지하여 상수값의 안정성이 보장된다.
3. enum을 이용해 새로운 상수들의 타입을 정의하므로써 정의한 타입 외의 타입을 가진 데이터값을 캄파일시 체크 할 수 있다.
4. enum이라는 키워드를 통해 구현의 의도를 파악 할 수 있다.(열거)
public class Example {
//기존에 상수를 정의하는 방법
public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";
public static void main (String[] args) {
String gender1;
gender1 = Example.MALE;
gender1 = Example.FEMALE;
//MALE, FEMALE이 아닌 상수 값이 할당 될 때
//컴파일시 에러가 나지 않음. -> 문제점 발생.
gender1 = "boy";
Gender gender2;
gender2 = Gender.MALE;
gender2 = Gender.FEMAL;
//컴파일 시 의도하지 않는 상수 값을 체크할 수 있음.
//Enum으로 정의한 상수값만 할당 받을 수 있음.
gender2 = "boy";
}
}
//enum class를 이용해 Gender라는 새로운 상수들의 타입을 정의한다.
enum Gender {
MALE,FEMAL;
}
gender1에서 상수 boy가 할당되었을떄, 유효성 검사가 없다면 이것이 잘못된건지 아닌지 알 수가 없음.
gender2에서는 Gender라는 상수타입으로 설정되어있는데, String 타입인 boy를 출력하려고하면 컴파일에서 에러가 발생 할 것이다.
그렇다면 이제 enum을 사용해볼까? enum은 별도의 Java를 선언 할 수도 있고, Class 내부와 외부에서도 선언이 가능하다.
1) 독립된 .java 선언
//BrandName.java
public enum BrandName {
NIKE, ADIDAS, PUMA
}
//Student.java
public class Student {
public String name;
public int grade;
public BrandName brand;
}
2) Class 내부에서 선언
public class Student {
public String name;
public int grade;
public enum BrandName {
NIKE, ADIDAS, PUMA
}
}
3) Class 외부에서 선언
public class Student {
public String name;
public int grade;
public BrandName brand;
}
enum BrandName {
NIKE, ADIDAS, PUMA
}
enum의 특징으로는
- 열거형으로 선언된 순서에 따라 0부터 index를 가진다. 순차적으로 증가됨.
- enum 열거형 지정된 상수들은 모두 대문자로 선언
- 마지막 열거형 변수 선언 이후에는 세미콜론(;)을 찍지 않음. 단, 상수와 연관된 문자를 연결 시킬 경우에는 세미콜론(;)을 찍어준다.
[Enum Method]
Static Methods | valueOf(String arg) | String값을 enum에서 가지고옴. 값이 없으면 예외 발생 |
valueOf(Class<T> class, String arg) | 넘겨받은 class에서 String 찾아, enum에서 가져옴. valueOf(String arg)는 내부적으로 자기자신 Class를 가져옴. | |
values() | enum의 요소들을 순서대로 enum 타입의 배열로 리턴. | |
Static이 아닌 경우의 Methods |
name() | 호출된 값의 이름을 String으로 리턴 |
ordinal() | 해당 값이 enum에 정의된 순서를 리턴 | |
compareTo(E o) | enum과 지정된 객체의 순서를 비교, 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수 return | |
equals(Object other) | 지정된 객체가 enum 정수와 같은 경우, true return |
Enum을 경우에 따라 사용해보기 예제
public class Student {
public String name;
public int grande;
public BrandName brand;
public static void main(String[] args) {
Student student = new Student();
student.name = "로춘남";
student.grande = 3;
student.brand = BrandName.NIKE;
System.out.println("학생 이름 : "+ student.name);
System.out.println("학생 학년 : "+ student.grande);
System.out.println("선호하는 브랜드 : "+ student.brand);
}
}
[결과값]
학생 이름 : 로춘남
학생 학년 : 3
선호하는 브랜드 : NIKE
1) values() (열거된 모든 원소를 배열에 담아 순서대로 리턴)
public class Student {
public String name;
public int grande;
public BrandName brand;
public static void main(String[] args) {
for(BrandName brand : BrandName.values()){
System.out.println(brand);
}
}
}
[결과값]
NIKE
ADIDAS
PUMA
2) valueOF() : 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 값을 return
public class Student {
public String name;
public int grande;
public BrandName brand;
public static void main(String[] args){
BrandName bn1 = BrandName.NIKE; //enum형 객체를 생성하고 가지고 오기
BrandName bn2 = BrandName.valueOf("PUMA"); //valueOf() 메소드 사용
System.out.println(bn1);
System.out.println(bn2);
}
}
[결과값]
NIKE
PUMA
3) 열거형 상수를 다른값과 연결
public class Student {
public String name;
public int grande;
public BrandName brand;
public static void main(String[] args){
for(BrandName brand : BrandName.values()){
System.out.println(brand.getName());
}
}
} enum BrandName {
NIKE("나이키"), ADIDAS("아디다스"), PUMA("퓨마");
final private String name;
public String getName() {
return name;
}
private BrandName(String name){
this.name = name;
}
}
[결과값]
나이키
아디다스
퓨마
enum class를 사용하면 상수값을 보다 편하게 관리 할 수 있을듯. 과거에는 코드팩으로 이루어진 테이블로 관리를 했다고하는데, 데이터의 값이 많아지면 enum으로 관리하는게 보다 수월 할 것 같다.
'JAVA' 카테고리의 다른 글
[JPA] JPA란 무엇인가? (0) | 2021.12.21 |
---|---|
[Java] Java 8 / Java 11 차이 자바 (0) | 2021.11.01 |
[Spring] IoC, DI, 컨테이너 (0) | 2021.10.19 |
[Java] Array 배열 Controller VO로 받기 파싱 (0) | 2021.10.18 |
[Java] 입출력 BufferedReader / BufferedWriter (0) | 2021.10.03 |