📌 Enum 열거형 (Enumeration)
- 관련이 있는 상수들의 집합이다.
- enum 타입 이름은 관례적으로 단어의 첫 글자는 대문자로 지정하고 enum의 상수는 전부 대문자로 연결하고 여러 단어는 언더바(_)로 연결한다.
- 어떤 클래스가 상수만으로 작성되어 있으면 반드시 class로 선언할 필요는 없습니다. 이럴 때 class로 선언된 부분에 enum이라고 선언하면 이 객체는 상수의 집합 enum 클래스가 된다.
- 인터페이스나 클래스 내에서 상수를 선언함으로써 상수를 관리하였는데 클래스 내에서 선언하는 부분은 네이밍이 겹칠 수 있고 불 필요하게 상수가 많아지는 단점이 있다.
- 인터페이스로 관리하는 경우 이런 부분은 줄어들지만 여전히 타입 안정성이 떨어지는 단점을 가지고 있었다. 이를 보완하며 나온 것이 Enum이다.
📌 생성자와 final 필드 추가
package study;
public enum Animal {
LION(1),
TIGER(2),
DOG(3);
private final int number;
Note(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
class AnimalTest {
public static void main(String[] args) {
System.out.println(Note.LION);
System.out.println(Note.DOG.getNumber()); // Dog 의 값 출력 = 1
}
}
- Enum 요소에 특정 값을 매핑하고 싶다면 위 코드처럼 필드 값을 추가하면 된다.
- 필드 값을 추가하면 생성자도 함께 추가해야 하는데 Enum 클래스는 생성자가 있다고 하더라도 new 연산으로 생성할 수 없다.
📌 특징
클래스를 상수처럼 사용할 수 있다.
- 생성자가 존재하지만 Default 생성자는 private 만 허용하고, public 으로 변경하는 경우 컴파일 에러가 발생한다. 즉 다른 클래스나 인터페이스에서의 상수 선언이 클래스 로드 시점에서 생성되는 것처럼 Enum 또한 생성자가 존재하지만 클래스가 로드되는 시점에서 생성되기 때문에 임의로 생성하여 사용할 수 없다.
Enum 클래스를 구현하는 경우 상수 값과 같이 유일하게 하나의 인스턴스가 생성되어 사용된다.
서로 관련 있는 상수 값들을 모아 enum으로 구현하는 경우
클래스와 같은 문법 체계를 따른다.
상속을 지원하지 않는다.
- Enum은 내부적으로 java.lang.enum 클래스에 의해 상속된다. 자바는 다중 상속을 지원하지 않기 때문에 Enum은 다른 클래스를 상속받을 수 없다.
- 상속은 지원하지 않지만 다양한 인터페이스 들은 구현할 수 있다.
📌 Enum 클래스 메서드
👉 values() 메서드
- values()는 Enum 클래스가 가지고 있는 모든 상수 값을 배열의 형태로 리턴한다. 참고로 단순히 String의 형태로 단순 반환하는 것이 아니라 Enum 클래스가 가지고 있는 모든 인스턴스를 배열에 담아 반환하는 것이다.
class Animal {
public static void main(String[] args) {
Animal[] Animals = Animal.values();
for (Animal a : Animals) {
System.out.print(a + " "); // LION TIGER DOG
}
for (int i = 0; i < Animal.length; i++) {
System.out.print(Animal[i] + " "); // LION TIGER DOG
}
}
}
👉 valueOf() 메서드
- valueOf() 메서드는 String을 파라미터로 받는데 인자로 들어온 String과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환한다.
class Animal {
public static void main(String[] args) {
System.out.println(Animal.valueOf("DOG"));
System.out.println(Animal.valueOf("LION"));
System.out.println(Animal.valueOf("TIGER"));
}
}
// Output
DOG
LION
TIGER
👉 ordinal() 메서드
- Enum 클래스 내부에 있는 상수들의 Index를 리턴하는 메서드이다. 배열과 마찬가지로 0부터 인덱스가 시작하며 인덱스의 length는 상수의 수 - 1이다.
class Animal {
public static void main(String[] args) {
Animal[] Animals = Animal.values();
for (Animal a : Animals) {
System.out.println(Animal + " " + Animal.ordinal());
}
}
}
// Output
LION 0
TIGER 1
DOG 2
'Java' 카테고리의 다른 글
[Java] 추상 클래스 & 인터페이스 (0) | 2022.06.03 |
---|---|
[Java] Call by value ? & Call by Reference ? (0) | 2022.05.31 |
[Java] 객체지향 5원칙 SOLID (0) | 2022.05.24 |
[Java] static, final, static final (0) | 2022.05.13 |
[Java] == 연산자 & equals() 차이점 (0) | 2022.05.12 |