Backend/Java

Enum 자바의 열거형

가은파파 2021. 1. 29. 20:46

학습 목표

  • enum 정의하는 방법

  • enum이 제공하는 메소드 (values()와 valueOf())

  • java.lang.Enum

  • EnumSet

 

enum은 자바 5.0부터 사용할 수 있게 되었다.

상수는 유일무이 고정된 값.

 

enum 정의하는 방법

상수의 그룹을 미리 정할 수 있는 것이 열거형(enumerated type)이다. 서로 연관된 상수들의 집합이라고 할 수 있다.

 

문법적으로 미리 상수를 고정시켜서, 런타임 에러를 방지하고, 컴파일시에 발견할 수 있도록 한다.

(좋은 프로그래밍은 자기자신을 견제해야 한다.)

 

class Fruit{
	public static final Fruit APPLE = new Fruit();
	public static final Fruit PEACH = new Fruit();
	public static final Fruit BANANA = new Fruit();
}

class Company{
	public static final Company GOOGLE = new Company();
	public static final Company APPLE = new Company();
	public static final Company ORACLE = new Company();
}

public class ConstantDemo{

	public static void main(String[] args)
    	if(Fruit.APPLE == Company.APPLE) // 컴파일 에러 생김.
        
        Fruit type = Fruit.APPLE;
        switch(type){
        	case Fruit.APPLE: //사용 불가
        	case Fruit.PEACH: //사용 불가
        	case Fruit.BANANA: //사용 불가
            
}

그러나 위와 같은 방법으로 switch 문을 사용할 때 일부 클래스 타입(Byte, String....)만 사용할 수 있기 때문에 위에 reference 타입 객체는 사용 할 수 없다.

 

위의 예제에서는 Fruit와 Company가 말하자면 열거인 셈이다. 이러한 패턴을 자바 1.5부터 문법적으로 지원하기 시작했는데 그것이 열거형이다. 이전 코드를 enum으로 바꿔보자.

 

/*
class Fruit{
	public static final Fruit APPLE = new Fruit();
	public static final Fruit PEACH = new Fruit();
	public static final Fruit BANANA = new Fruit();
}
*/
enum Fruit{
	APPLE, PEACH, BANANA
    Fruit () {
    	System.out.pringln("Call Constrctor"+this);
    }
}

class Company{
	public static final Company GOOGLE = new Company();
	public static final Company APPLE = new Company();
	public static final Company ORACLE = new Company();
}

public class ConstantDemo{

	public static void main(String[] args)
        Fruit type = Fruit.APPLE;
        switch(type){
        	case APPLE: //사용 가능
        	case PEACH: //사용 가능
        	case BANANA: //사용 가능
}

enum을 사용하는 장점

  • 코드가 단순해진다.

  • 인스턴스의 생성과 상속을 방지한다.

  • 키워드로 enum을 사용하면 구현의 의도와 열거임을 분명하게 들어낼 수 있다.

enum이 제공하는 메소드 (values()와 valueOf())

 

클래스로 상수를 정의하게 되면 각각의 클래스를 배열처럼 열거할 수 없다. 그러나 enum이 제공하는 values()를 활용하면 배열처럼 정의된 상수를 꺼내서 쓸 수 있다.

valueOf(String name) 는 구체적인 이름을 명시하면 value값을 return할 수 있다.

enum Fruit{
	APPLE("red"), PEACH("pink"), BANANA("yellow"); //생성자 호출
    public String color;
    public String getColor(){
    	return this.color;
    }
    Fruit (String color) {
    	System.out.pringln("Call Constrctor"+this);
        this.color = color;
    }//생성시에 과일의 색깔까지 함께 생성된다.
}
public class ConstantDemo{

	public static void main(String[] args)
        Fruit type = Fruit.APPLE;
        switch(type){
        	case APPLE: //사용 가능
            	System.out.pringln(57+" kcal, color "+Fruit.APPLE.color);
                break;
        	case PEACH: //사용 가능
            	System.out.pringln(34+" kcal, color "+Fruit.PEACH.color);
                break;
        	case BANANA: //사용 가능
            	System.out.pringln(93+" kcal, color "+Fruit.BANANA.color);
                break;
                
       for(Fruit f : Fruit.values()){
       	System.out.println(f+", "+ f.getColor());
       }
       //클래스를 열거하여 사용할 수 있다.
}

열거형의 특성

  • 열거형은 연관된 값들을 저장한다.

  • 또 그 값들이 변경되지 않도록 보장한다.

  • 뿐만 아니라 열거형 자체가 클래스이기 때문에 열거형 내부의 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 큰 역할을 할 수 있다.

java.lang.Enum

 

compareTo​(E o) : this.enum과 다른 객체를 비교할 수 있다.

describeConstable() : descriptor 리턴

equals(Object other) : 상수값비교

 

 

EnumSet

enum 타입을 Set 인터페이스를 활용하여 효율적으로 실행 시킬 수 있다. 

 

enumSet 특징

 

  • AbstractSet을 상속, SetInterface를 인터페이스

  • Collecton멤버 이다.

  • HashSet보다 퍼포먼스가 좋다.

  • 모든 enumSet 요소는 단일 열거형 타입이 set이 생성되었을 때 구체화 된다.

allOf (Class elementType)

모든 요소들을 보여준다.

noneOf (Class elementType)

empty enum으로 만들어준다

copyOf (Collection c)

enumset을 복사해 준다.

of (E e)

This method is used to create an enum set initially, containing a single specified element.

range (E from, E to)

This method is used to initially create an enum set that contains the range of specified elements.

clone()

This method is used to return a copy of the specific set.

 

샘플 예제

import java.util.EnumSet; 
enum example  
{ 
    one, two, three, four, five 
}; 
public class main 
{ 
    public static void main(String[] args)  
    { 
        // Creating a set 
        EnumSet<example> set1, set2, set3, set4; 
  
        // Adding elements 
        set1 = EnumSet.of(example.four, example.three,  
                          example.two, example.one); 
        set2 = EnumSet.complementOf(set1); 
        set3 = EnumSet.allOf(example.class); 
        set4 = EnumSet.range(example.one, example.three); 
        System.out.println("Set 1: " + set1); 
        System.out.println("Set 2: " + set2); 
        System.out.println("Set 3: " + set3); 
        System.out.println("Set 4: " + set4); 
    } 
} 

실행 결과

출처

 

'Backend > Java' 카테고리의 다른 글

JAVA 상속  (0) 2021.02.20
annotations  (0) 2021.02.06
[Java] 클래스  (0) 2021.01.20
[Java] 선택문, 반복문  (0) 2021.01.18
Java 예외 처리 정리  (0) 2021.01.16