JAVA

[Java] enum의 개념과 사용법

로춘남 2021. 10. 19. 14:03
728x90


Enum Class란?

열거형이라고 부르며, 서로 연관된 상수들의 집합을 의미한다. 기존에 상수를 정의할때는 final static String과 같은 문자열이나 숫자로 나타냈었는데, enum을 사용하면 보다 코드의 가독성을 높힐 수 있다.

 

그렇다면 enum을 쓰게 되면 우리가 얻을 수 있는건 무엇일까?

 

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

2. 인스턴스의 생성과 상속을 방지하여 상수값의 안정성이 보장된다.

3. enum을 이용해 새로운 상수들의 타입을 정의하므로써 정의한 타입 외의 타입을 가진 데이터값을 캄파일시 체크 할 수 있다.

4. enum이라는 키워드를 통해 구현의 의도를 파악 할 수 있다.(열거)

 

public class Example {
 
    //기존에 상수를 정의하는 방법
    public static final String MALE = "MALE";
    public static final String FEMALE = "FEMALE";
    public static void main (String[] args) {
        String gender1;
         
        gender1 = Example.MALE;
        gender1 = Example.FEMALE;
         
        //MALE, FEMALE이 아닌 상수 값이 할당 될 때 
        //컴파일시 에러가 나지 않음. -> 문제점 발생.
        gender1 = "boy";
         
        Gender gender2;
        gender2 = Gender.MALE;
        gender2 = Gender.FEMAL;
         
        //컴파일 시 의도하지 않는 상수 값을 체크할 수 있음.
        //Enum으로 정의한 상수값만 할당 받을 수 있음.
        gender2 = "boy"; 
    }
}

//enum class를 이용해 Gender라는 새로운 상수들의 타입을 정의한다.
enum Gender {
    MALE,FEMAL;
}

gender1에서 상수 boy가 할당되었을떄, 유효성 검사가 없다면 이것이 잘못된건지 아닌지 알 수가 없음.

gender2에서는 Gender라는 상수타입으로 설정되어있는데, String 타입인 boy를 출력하려고하면 컴파일에서 에러가 발생 할 것이다.

 

그렇다면 이제 enum을 사용해볼까? enum은 별도의 Java를 선언 할 수도 있고, Class 내부와 외부에서도 선언이 가능하다.

 

1) 독립된 .java 선언

//BrandName.java
public enum BrandName {
	NIKE, ADIDAS, PUMA
    }
    
//Student.java
public class Student {
	public String name;
   	public int grade;
   	public BrandName brand;
}

 

2) Class 내부에서 선언

public class Student {
	public String name;
    public int grade;
    public enum BrandName {
		NIKE, ADIDAS, PUMA
    }
}

 

3) Class 외부에서 선언

public class Student {
	public String name;
    public int grade;
    public BrandName brand;
   }
   
   enum BrandName {
   NIKE, ADIDAS, PUMA
}

 

enum의 특징으로는

- 열거형으로 선언된 순서에 따라 0부터 index를 가진다. 순차적으로 증가됨.

- enum 열거형 지정된 상수들은 모두 대문자로 선언

- 마지막 열거형 변수 선언 이후에는 세미콜론(;)을 찍지 않음. 단, 상수와 연관된 문자를 연결 시킬 경우에는 세미콜론(;)을 찍어준다.

 

[Enum Method]

Static Methods valueOf(String arg) String값을 enum에서 가지고옴. 값이 없으면 예외 발생
valueOf(Class<T> class, String arg) 넘겨받은 class에서 String 찾아, enum에서 가져옴. valueOf(String arg)는 내부적으로 자기자신 Class를 가져옴.
values() enum의 요소들을 순서대로 enum 타입의 배열로 리턴.
Static이
아닌 경우의 Methods
name() 호출된 값의 이름을 String으로 리턴
ordinal() 해당 값이 enum에 정의된 순서를 리턴
compareTo(E o) enum과 지정된 객체의 순서를 비교, 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수 return
equals(Object other) 지정된 객체가 enum 정수와 같은 경우, true return

 

Enum을 경우에 따라 사용해보기 예제

public class Student {
    public String name;
    public int grande;
    public BrandName brand;

    public static void main(String[] args) {
        Student student = new Student();
        student.name = "로춘남";
        student.grande = 3;
        student.brand = BrandName.NIKE;
        System.out.println("학생 이름 : "+ student.name);
        System.out.println("학생 학년 : "+ student.grande);
        System.out.println("선호하는 브랜드 : "+ student.brand);
    }
}

[결과값]

학생 이름 : 로춘남

학생 학년 : 3

선호하는 브랜드 : NIKE

 

1) values() (열거된 모든 원소를 배열에 담아 순서대로 리턴)

public class Student {
    public String name;
    public int grande;
    public BrandName brand;

    public static void main(String[] args) {
        for(BrandName brand : BrandName.values()){
            System.out.println(brand);
        }
    }
}

[결과값]

NIKE

ADIDAS

PUMA

 

2) valueOF() : 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 값을 return

public class Student {
    public String name;
    public int grande;
    public BrandName brand;

    public static void main(String[] args){
        BrandName bn1 = BrandName.NIKE;	//enum형 객체를 생성하고 가지고 오기
        BrandName bn2 = BrandName.valueOf("PUMA");	//valueOf() 메소드 사용
        System.out.println(bn1);
        System.out.println(bn2);
    }
}

[결과값]

NIKE

PUMA

 

3) 열거형 상수를 다른값과 연결

public class Student {
    public String name;
    public int grande;
    public BrandName brand;

    public static void main(String[] args){
        for(BrandName brand : BrandName.values()){
            System.out.println(brand.getName());
        }
    }
} enum BrandName {
    NIKE("나이키"), ADIDAS("아디다스"), PUMA("퓨마");
    final private String name;
    public String getName() {
        return name;
    }
    private BrandName(String name){
        this.name = name;
    }
}

[결과값]

나이키

아디다스

퓨마

 

enum class를 사용하면 상수값을 보다 편하게 관리 할 수 있을듯. 과거에는 코드팩으로 이루어진 테이블로 관리를 했다고하는데, 데이터의 값이 많아지면 enum으로 관리하는게 보다 수월 할 것 같다.

 

728x90