ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - enum이란
    Java/java study 2022. 2. 27. 22:58
    728x90
    반응형

     

     

    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

    댓글

Designed by Tistory.