상세 컨텐츠

본문 제목

[JAVA] enum 사용

개발/JAVA, Spring

by 똘똘이박사 2023. 11. 10. 08:19

본문

상수를 사용하는 이유

개발을 하다 보면 여러가지 설정 값들이 특유의 코드로 설정되는 경우가 많다. 

가령 월요일은 '1', 화요일은 '2'...... 일요일은 '0' 하는 식이다.

코드에서는 '1', '2' 같은 코드만 바라본다. 아래와 같이 해당 코드를 처음 보는 사람은 그 의미를 쉽게 알 수 없다.

if( "1".equals(days)){
	//todo
}

 

하지만 이것의 코드에 의미를 부여 하면 처음 코드를 보는 사람들도 그 의미 쉽게 파악 할 수 있다.

public static final int MON = "1";
... //나머지 요일 생략

if(MON.equals(days)){
	//todo
}

 

한줄이 더 추가되긴 했지만 코드는 더 가독성이 높아져 쉽게 의미를 파악 할 수 있게 되었다.

코드는 무조건 짧게 짜는게 좋은 것이 아니다. 다른 사람이 봤을때 쉽게 파악이 가능해야 한다.

(미래의 나를 위해서도 그러는 편이 좋다.)

 

 

enum의 사용

enum 이란 서로 관련된 상수들을 정의하여 편리하게 사용하기 위한 자료형(열거형)을 말한다.

기존 상수의 단점중 하나는 정의해야 할 항목이 많아 질 수록 코드가 난잡해진다는데 있다.

enum을 사용하면 관리가 수월해 지고 enum class 안에 정의된 멤버들만 사용할 수 있으므로 런타임 시 발생할 수 있는 오류 역시 줄일 수 있다.

 

기본적으로 enum 은 아래와 같이 쓸 수 있다.

public enum UseDays{
	MON, TUE, WED, THU, FRI, SAT, SUN;
}

  

가장 간단한 형태의 enum class 이다.

선언된 순서에 따라 0부터 인덱스 값을 가진다.

따라서 MON = 0 .... SUN = 6 의 값을 가진다.

 

하지만 각 요일의 값을 각각 지정해야 하는 케이스도 있다. 이럴때 아래와 같이 작성 할 수 있다.

public enum UseDays{
    MON(10),
    TUE(20),
    WED(30),
    THU(40),
    FRI(50),
    SAT(60),
    SUN(70);
    
    private int value;
    
    private UseDays(int value){
    	this.value = value;
    }
    
    public int getValue(){
    	return this.value;
    }
}

 

각각의 상수값에 값을 설정하는 방법은 () 안에 값을 지정하면 된다.

위의 예제에서는 값을 한개만 설정 하였는데 하나 이상 설정 가능하다.

public enum UseDays{
    MON("월요일", 10),
    TUE("화요일", 20),
    WED("수요일", 30),
    THU("목요일", 40),
    FRI("금요일", 50),
    SAT("토요일", 60),
    SUN("일요일", 70);
    
    private String name;
    private int value;
    
    private UseDays(String name, int value){
    	this.name = name;
    	this.value = value;
    }
    
    public String getName(){
    	return this.name;
    }
    
    public int getValue(){
    	return this.value;
    }
}

 

다만 상수값에 설정하는 값들이 늘어 날 수록 해당값에 대응하는 멤버 역시 증가한다는 것이다.

또한 값을 지정하면 반드시 생성자를 만들어 줘야 하며 private 이어야 한다.

생성자 작성 시 유의할 점은 상수 지정 시 순서대로 파라미터를 만들어 줘야 한다.

그리고 해당 값들을 꺼내 읽을 수 있도록 getter 도 생성해 주자.

위와 같이 설정하였다면 아래와 같이 사용할 수 있다.

public class MainClass{
	public static void main(String[] args){
        for(UseDays days : UseDays.values()){
        	System.out.println(days.name() + " : " + days.getName() + ", " + days.getValue());
        }
    }
}

 

간단하게 모든 상수들을 출력해 보는 구문이다.

참고로 stream을 이용한 처리도 가능하다.

stream 으로 처리하기 위해서는 enum class 와 main class 각각 아래와 같이 추가해 줘야 한다.

 

 

//enum class 하단에 추가
import java.util.stream.Stream;

public enum UseDays{
	... 생략
    public static Stream<UseDays> stream(){
        return Stream.of(UseDays.values());
    }
}

 

 

사용법

UseDays.stream()
	.filter(d -> d.getName.equals("월요일"))
        .forEach(System.out::println);

---------

반응형

관련글 더보기