-
Java - enum이란Java/java study 2022. 2. 27. 22:58728x90반응형
enum이란?
Enum(열거형)은 서로 관련된 상수들을 정의하여 편리하게 사용하기 위한 자료형이다. 기존의 상수를 사용하면서 발생했던 문제점과 불편했던 점 등을 개선하고자 jdk1.5부터 추가된 기능이다.
- enum이 생긴 이유
- enum 정의
- Enum 클래스에 제공하는 메서드
- EnumSet
enum이 생긴 이유
- 코드의 가독성을 높여준다.
- 열거형이 가지는 값뿐만 아니라 타입까지 관리하기 때문에 논리적인 오류를 줄일 수 있다.
- 상수와 리터럴이 논리적인 연관이 없다.
- 서로 다른 개념끼리 이름이 충돌할 수 있다.
- 서로 다른 개념임에도 비교 연산이 가능한다.
enum 정의
1. num에 정의된 상수들은 해당 enum type의 객체이다.
enum Fruit { APPLE, PEACH, BANANA }
위와 같은 열거형이 정의되어 있을 때, 이 열거형을 클래스로 정의한다면 다음과 같이 표현할 수 있다.
class Fruit { public static final Fruit APPLE = new Fruit("APPLE"); public static final Fruit PEACH = new Fruit("PEACH"); public static final Fruit BANANA = new Fruit("BANANA"); private String name; private Fruit(String name) { this.name = name; } }
실제 enum의 구현과는 다르지만, 이런 형태로 생각하면 처음 enum을 이해하는데 다가가기 쉬울 것이다.
2. enum에 생성자와 메서드를 추가할 수 있다.
enum Fruit { APPLE, PEACH, BANANA; Fruit() { System.out.println("생성자 호출 " + this.name()); } } public class test { public static void main(String[] args) { // TODO Auto-generated method stub Fruit apple = Fruit.APPLE; } }
enum은 위와 같이 생성자를 정의할 수 있는데, 접근제어자는 private이기 때문에 외부에서 접근할 수 없으며 열거형의 멤버 중 하나를 호출하면 열거된 모든 상수의 객체가 생성된다. 위 코드를 보면 열거형 멤버 중 APPLE 하나를 호출했지만 열거된 모든 상수의 생성자가 호출되었음을 확인할 수 있다. (각각의 상수는 public satatic final의 형태로 인스턴스가 생성된다.)
3. 값을 가진 enum 상수는 생성자도 함께 정의해줘야 한다.
열거형 상수에 괄호를 붙여서 값을 부여할 수 있는데, 이에 해당하는 생성자도 함께 정의해줘야 한다.
enum 열거형이름 { 상수명(), // 생성자 호출 상수명(), // 생성자 호출 상수명() // 생성자 호출 private final [데이터타입] [변수이름]; // [접근지정자] [final] 는 설정할 수 있지만, // private final 을 사용하는 것이 일반적이다. public get변수이름() { return 변수이름; } private 생성자(매개변수..) { 변수 = 값; } }
상수의 값을 저장할 데이터는 접근 지정자를 선택할 수 있지만 public으로 선언 시에는 외부에서 자유롭게 호출할 수 있어 캡슐화가 깨진다는 문제가 있다. 때문에 private 접근 지정을 주고 getter 메서드를 생성해주는 것이 바람직하다.
예시)
enum Currency { PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; Currency(int value) { this.value = value; } public int value() { return value; } } public class EnumDemo { public static void main(String[] args) { System.out.println(Currency.DIME.value()); // 10 } }
Enum 클래스에 제공하는 메서드
메서드 설명 T[] values() 해당 enum 타입에 정의된 상수 배열을 반환한다. T valueOf(String name) 문자열과 일치하는 열거형의 상수를 반환 Class<E> getDeclaringClass() 열거형의 객체를 반환한다. String name() (toString()) 열거형 상수의 이름을 문자열로 반환한다. int ordinal() 열거형 상수가 정의된 순서를 반환한다.(0부터 시작) T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다. 참고
java.lang.Enum 클래스는 모든 자바 열거형의 조상이다.
따라서 모든 열거형은 Enum 클래스를 상속받았기 때문에 별도의 상속을 받을 수 없다.
EnumSet
EnumSet은 열거형을 위해 고안된 특별한 Set 인터페이스 구현체이다. HashSet과 비교했을 때 성능 상의 이점이 많기 때문에 열거형 데이터를 위한 Set이 필요한 경우 EnumSet을 사용하는 것이 좋다.
메서드 이름 설명 copyOf(EnumSet s) 매개변수로 들어온 EnumSet을 복사 noneOf(Class elementType) 비어있는 EnumSet을 반환 of(E e1, E e2, ...) 열거형 상수 n개를 입력받아 새로운 EnumSet 반환 ComplementOf(EnumSet s) 매개변수에 들어온 EnumSet의 열거형 상수들을 제외한
열거형 상수들을 새로운 EnumSet에 넣어 반환range(E from, E to) 입력한 열거형 상수포함한 사이의 모든 상수들을 EnumSet 반환 728x90반응형'Java > java study' 카테고리의 다른 글
Java - Input과 Output(I/O) (0) 2022.03.27 Java - 애노테이션(annotation) (0) 2022.03.06 Java - Thread (0) 2022.02.20 Java - 예외 처리 (0) 2022.02.13 Java - 인터페이스(interface) (0) 2022.02.06