관리 메뉴

개발노트

[Java] 열거체 enum 클래스 본문

Java

[Java] 열거체 enum 클래스

YoonGwon 2021. 1. 20. 16:14

enum 이란?

- 열거체(enumeration type)로 JDK 1.5 이상에서 사용할 수 있다.

- 기본적인 특징

  • 클래스의 일종. 참조 자료형. (클래스 처럼 보이게 하는 상수)
  • enum Class 형을 기반으로 한 클래스형 선언
  • 서로 관련 있는 상수들을 모아 집합으로 정의함. 즉 정해진 값만 사용할 수 있도록 제한됨.
  • 자료형이 없음.
  • 새로운 열거형을 선언하면, 내부적으로 Enum 클래스형 기반의 새로운 클래스형이 만들어짐
  • 열거된 순서에 따라 0부터 순서값을 가짐, 차례대로 증가함
  • enum 열거형으로 지정된 상수는 대문자 사용.
  • 마지막 끝에 세미콜론을 붙이지 않음.

- 사용간 특징

  • 열거형으로 선언된 순서에 따라 0부터 index 값을 가진다. (순차적으로 증가)
  • enum 열거형으로 지정된 상수들은 모두 대문자로 선언한다.
  • 열거형 변수들을 선언한 후 마지막에 세미콜론(;)을 찍지 않는다.
  • 상수와 특정 값을 연결시킬경우 마지막에 세미콜론(;)을 붙여줘야한다.
  • [enum생성자는 왜 private일까?]
    public과 protected로 설정하게 되면 에러가 발생한다.
    enum 타입은 고정된 상수들의 집합으로 런타임이 아닌 컴파일 타임에 모든 값을 알고 있어야한다.
    즉, 다른 패키지나 클래스에서 enum 타입에 접근해서 동적으로 어떤 값을 정해줄 수 없다.
    따라서 컴파일시에 타입 안정성이 보장됨.
    해당 enum클래스 내에서 까지도 new 키워드로 인스턴스 생성이 불가능하다.

 

[ 사용 시 장점 ]

1) 코드가 단순해지고, 가독성이 좋아진다.

2) 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장 (컴파일 때 체크)

3) enum 키워드를 사용해서 구현의 의도가 열거임을 분명히 나타냄

 

[ 사용 시  ]

1) 상수를 사용하는 클라이언트 코드와 함께 컴파일됨, 값이 변경되면 다시 컴파일 다시해야함.

2) 크기를 알아낼수 없음.

3) 디버깅이 불편함.

 

- ENUM 메소드

Static

Methods

 valueOf(String arg)

String 값을 enum에서 가져온다. 값이 없으면 Exception 발생 

 valueOf(Class<T> class, String arg) 

넘겨받은 class에서 String을 찾아, enum에서 가져온다. valueOf(String arg)는 내부적으로 자기 자신의 class를 가져오는 것이다. 

values() 

enum의 요소들을 순서대로 enum 타입의 배열로 리턴한다.

ENUM$VALUES의 카피이므로, 너무 자주 호출하는 것은 좋지 않음 

 Static 아닌

Methods

name() 

호출된 값의 이름을 String으로 리턴한다. 

ordinal()

해당 값이 enum에 정의된 순서를 리턴한다. (index 값 리턴)

compareTo(E o) 

이 enum과 지정된 객체의 순서를 비교한다. 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수를 반환한다. 

equals(Object other) 

지정된 객체가 이 enum 정수와 같은 경우, true를 반환한다. 

 

*여기서 주로 사용되는 메소드는 values() , ordinal() , valueOf() 정도이다.


- ENUM 사용 예제

 프로그래밍을 하다보면 몇가지의 한정된 데이터들을 가지는 경우가 있다. 대표적으로는 "요일" 이나 "계절" 같은것이 있다.
요일은 월,화,수,목,금,토,일 이렇게 7가지가 있고, 계절도 봄, 여름, 가을, 겨울 4가지 계절로 한정되어 있다. 이렇게 이와 같이 한정된 데이터들을 갖는 데이터들은 열거형(enum)으로 묶어주면 편하다.

 

[열거형(Enum) 선언 방법]

enum Season { //class 외부에서 선언
    봄, 여름, 가을, 겨울
}

public class enum_ex {
	public enum Season { //class 내부에서 선언
        봄, 여름, 가을, 겨울
    }
}

 enum 키워드는 열거 타입을 선언하기 위한 키워드 이다. 열거 타입(Season)이름을 지정하고 열거 상수(봄,여름,가을,겨울)를 나열하면 된다. 열거 타입 이름으로 소스파일(.java)를 생성하여도 된다.

 

[열거형(Enum) 사용법]

public class enum_ex {
    public enum Season {
	    봄, 여름, 가을, 겨울
    }
	
    public static void main(String[] args) {
        Season season = Season.봄;
        System.out.println(season);
        System.out.print(Season.여름);
    }
}

열거형 변수 enum을 사용할때에는 위와 같이 마치 class에서 특정값을 땡겨갈때와 똑같이 사용하면 된다.

 

[실사용 예시]

enum Season {
    봄, 여름, 가을, 겨울
}

public class People {
    public String name; //이름
    public Season favorite_session; //좋아하는계절

    public static void main(String[] args) {
    	People people = new People();
        
    	people.name = "홍길동";
    	people.favorite_session = Season.봄;
         
        System.out.println("이름 : " + people.name);
        System.out.println("좋아하는 계절 : " + people.favorite_session);
    }
}

 enum이 사용되어질때는 위와 같이 사람별로 좋아하는 계절을 구해야하는 일이 생길경우 이름은 계속해서 변하지만 좋아하는계절의 계절의 경우에는 봄, 여름, 가을, 겨울 이렇게 4가지 계절로 고정이다. 이럴때 계절에다가 enum을 활용하면 좋다.

 

 

참조 : coding-factory.tistory.com/522

728x90

'Java' 카테고리의 다른 글

[JAVA] Collection 정리  (0) 2021.01.19
동일성(identity, ==)과 동등성(equality, equals())  (0) 2021.01.18