Programming/JAVA

[Java 자바] 열거형 상수(enum)의 기본 사용법

꼬ㄴi 2023. 9. 30. 22:19

⚾enum이란?

    :  공통점을 가진 상수들의 집합

 

계절 혹은 요일처럼 특정한 카테고리로 묶을 수 있는 데이터들이 있다.

프로그래밍을 하다보면 상수를 static final 로 선언하는 경우가 많은데, 이는 상수의 갯수가 많아질수록 효율을 떨어뜨린다.

enum은 이를 보완하기 위해 만든 열거형 타입으로, 서로 연관된 상수들은 enum 클래스로 묶어주면 편리하다.

 

 

⚽enum 선언하기

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

타입의 이름은 직관적으로 짓는 것이 가독성이 좋다.

[ 봄, 여름, 가을, 겨울 ] 의 공통점은 계절이니 Season 타입으로 선언했다.

 

enum Season {
    봄("spring"), 
    여름("summer"), 
    가을("autumn"), 
    겨울("winter");
	
    private String value;
	
    private Season(String value) {
	    this.value = value;
	}
	
    public String getValue() {
	    return value;
    }
}

상수에 값을 할당하여 선언할 수도 있다.

이 경우에는 private 값에 대한 생성자, 그리고 상수의 값을 리턴할 getValue(  ) 메서드를 생성한다.

 


🏀생성자는 private ? getValue(  )는 public ?

 

enum을 처음 사용할 때 드는 의문이다.

또한 setValue(  )는 없는 이유는 무엇일까?

 

enum은 상수의 집합이다. 따라서 enum 타입의 데이터들은 모두 상수이다.

그리고 상수는  static final  의 속성을 가진다.

👇

static == 컴파일시 static 메모리 영역에 올라감

final == 선언 이후 불변의 값

 

컴파일할 때 그 값을 이미 알고 있어야 하기 때문에 외부에서 따로 생성자를 호출해서 값을 할당할 필요가 없고,

외부에서 값을 변경할 수 없어야 하므로 생성자는 항상 private  이다. 

(조금 더 자세한 내용을 알고 싶다면 👉 https://www.nextree.co.kr/p11686/ )

마찬가지로 외부의 접근이 불필요하기 때문에 setValue(  )도 당연히 불필요하다.

 

그렇다면 getValue(  )는 왜 필요한지?

이것 역시 데이터에 직접 접근하지 않고 간접적으로  값을 가져오기 위함이다.

 


🎱enum 사용법

enum Gender {
    men("남성"),
    women("여성");
	
    private String value;
	
    private Gender(String value) {
        this.value = value;
    }
	
    public String getValue() {
	    return value;
    }
}

public class EnumTest {
    public static void main(String[] args) {
		
        System.out.println(Gender.men);

        System.out.println(Gender.men.getValue());
    }
}

[출력] 👇

 

값을 따로 할당하지 않은 경우 상수명이 그 값이 되므로, 상수명만 입력했다면 상수명이 그대로 출력된다.

값을 할당한 경우 getValue(  ) 메서드를 사용해서 출력할 수 있다.

 


🏐enum 클래스 메서드 사용하기

 

1) name (  ) : 상수에 할당된 값을 알려준다.

enum Direction{
    동쪽, 서쪽, 남쪽, 북쪽
}

public class EnumTest {
    public static void main(String[] args) {
        System.out.println(Direction.동쪽.name());
    }
}

[출력] 👉 동쪽

 

 

2) ordinal(  ) : 상수가 몇 번째로 선언되었는지 알려준다. 인덱스는 0부터 시작한다.

enum Direction{
    동쪽, 서쪽, 남쪽, 북쪽
}

public class EnumTest {
    public static void main(String[] args) {
        System.out.println(Direction.동쪽.ordinal());
    }
}

[출력] 👉 0

 

 

3) values(  ) : 해당 타입 객체들을 배열 형태로 반환한다.

enum Direction{
    동쪽, 서쪽, 남쪽, 북쪽
}

public class EnumTest {
    public static void main(String[] args) {
       Direction[] directions = Direction.values();
	
        for(Direction direction : directions) {
            System.out.println(direction);
        }
    }
}

[출력] 👇