목표
자바의 열거형에 대해 학습하세요.
학습할 것 (필수)
enum 정의하는 방법
enum이 제공하는 메소드 (values()와 valueOf())
java.lang.Enum
EnumSet
enumerate in programming - 상수로 식별하는 역할을 한다.
The enumerator names are usually identifiers that behave as constants in the language.
Constant (computer programming) - Wikipedia
In computer programming, a constant is a value that cannot be altered by the program during normal execution, i.e., the value is constant.[a] When associated with an identifier, a constant is said to be "named," although the terms "constant" and "named con
en.wikipedia.org
JAVA에서는 final로 String과 같은 기본 자료형의 값을 고정한다 => 상수
클래스 내부나 인터페이스에 상수값을 고정할 경우 충돌이 많이 발생하고, 수정할 때 불편하다는 점 때문에 Enum 자료형이 생성되었다.
Enum은 이름있는 상수의 집합을 의미한다.
장점
- 가독성을 높인다.(개발자의 의도가 분명히 드러난다.)
- 불필요한 인스턴스의 생성을 막아주고 충돌을 방지한다.
특징
- 컴파일 시점에 모든 값을 알고 있어야 한다.
열거형(Enum)을 정의하는 방법은 간단하다.
enum Menu{
AMERICANO, LATTE, CHOCO, TEA;
}
이 간단한 작업이 내부적으로 이렇게 작동한다.
class Menu{
public static final Menu AMERICANO = new Menu();
public static final Menu LATTE = new Menu();
public static final Menu CHOCO = new Menu();
public static final Menu TEA = new Menu();
}
그래서 사용할 때에도 다른 클래스의 static변수를 사용할 때 처럼 클래스명.변수 이름으로 사용하면 된다. (생성X)
각각의 enum 상수는 객체를 나타낸다.
즉, 클래스가 가진 특징들을 활용할 수 있다.(생성자, 메소드, 변수 추가 등등)
enum Menu {
AMERICANO(4100), LATTE(4600), CHOCO(5000), TEA(5500);
private int value;
Menu(int value) {//private생략 되어 있음 public 선언시 컴파일 에러!
this.value = value;
}
public int getValue() {
return value;
}
}
enum 클래스는 런타임 시점에 동적으로 값을 할당할 수 없다 !
새로운 상수를 가진 인스턴스를 생성할 수 없다는 말이기도 하다. new 로 새로운 객체를 생성하려고 하면 컴파일 에러가 발생한다.
Enum이 제공하는 메서드 values(), valuesOf(), ordinal()
ordinal() | 열거형 답게 변수별로 index를 출력해주는 메서드 |
values() | Enum[] 로 enum안의 모든 값을 리턴 |
valueOf() | 값이 존재하면, 이넘 상수 리턴 |
valueOf() 메서드는 enum에 없는 값을 인자로 넘겨주면 IllegalArgumentException을 발생시킨다.
values()를 사용하는 코드를 보면,
Menu arr[] = Menu.values();
for (Menu menu : arr) {
System.out.println(menu + "index : "+ menu.ordinal());
}
java.lang.Enum
public abstract class Enum<E extends Enum>
extends Object
implements Comparable, Serializable{
}
-Enum 클래스를 상속받고 있다.
위와 같이 유용한 10가지 메서드를 제공한다.
toString를 제외하고 final이 붙어 있어 오버라이딩이 불가능하다.
그 이유는 , 위에서 언급 했듯이 프로그래머가 생성자에 접근할 수 없기 때문이다. -> sole constructor
컴파일 시점에 방출되는 것만 코드에서 사용할 수 있습니다.
EnumSet
Enum 을 위해 고안된 Set 인터페이스 이다.
바로 코드로 확인해보자. 기본적인 메서드들은 기존의 collection framewordk에서 사용하는 것들이다.
import java.util.EnumSet;
enum Menu2{
AMERICANO, LATTE, CHOCO, TEA;
}
public class DemoEnumSet {
public static void main(String[] args) {
EnumSet<Menu2> set1,set2,set3,set4;
//adding element
set1 = EnumSet.of(Menu2.AMERICANO,Menu2.LATTE, Menu2.CHOCO);
// set1이 가지고 있지 않은 값 출력 enum 클래스 전부를 set에 추가하면 빈 리스트 리턴
set2 = EnumSet.complementOf(set1);
set3 = EnumSet.allOf(Menu2.class);
set4 = EnumSet.range(Menu2.AMERICANO, Menu2.CHOCO);
System.out.println(set4);
// removing element
set4.remove(Menu2.AMERICANO);
System.out.println(set4);
System.out.println(set4.contains(Menu2.AMERICANO));
System.out.println(set2);
}
}
'Java > Study' 카테고리의 다른 글
[JAVA] 백기선 라이브 스터디 12주차 Annotation (0) | 2021.02.06 |
---|---|
[Java]터미널 javac 실행시 cannot find symbol처리 방법 (0) | 2021.01.28 |
[JAVA] 로컬 클래스 , 익명 클래스, 람다의 스코프 차이 (0) | 2021.01.25 |
[JAVA]백기선 라이브 스터디 10주차 - Thread (0) | 2021.01.21 |
[JAVA] 백기선 라이브 스터디 9주차 예외처리 (0) | 2021.01.13 |