상세 컨텐츠

본문 제목

Enum 메소드 및 활용

Spring/JAVA

by Chan.94 2022. 6. 21. 22:56

본문

반응형

[Spring & Spring Boot/JAVA] - Enum 장점


단순 활용

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

 

필드 추가

public enum Cur {
	KRW("KRW"),	//한국
	USD("USD"),	//미국
	JPY("JPY"),	//일본
	CNY("CNY"),	//중국
	;
    
	private final String name;
	Cur (String name) {
		this.name = name;
	}

}

Enum 요소에 특정 값을 매핑하고 싶다면 위 코드처럼 필드값을 추가하면 된다.

필드값을 추가하면 생성자도 함께 추가해야하는데 Enum 클래스는 생성자가 있다고 하더라도 new 연산으로 생성할 수 없습다.

 

Enum 클래스로 묶어두면 가독성도 좋아지고 if 문으로 일일히 검사할 필요도 없어서 편리합니다.
필드값을 추가할 때 이름을 name 으로 정하는건 피하는게 좋습니다.
Enum 클래스 자체에서 name() 이라는 메소드를 제공하기 때문에 헷갈릴 수 있습니다.


Enum 메소드

  • values : 열거체의 모든 상수를 저장한 배열을 생성하여 반환
  • ordinal : 열거된 순서를 정수 값으로 반환
  • valueOf : 전달된 문자열과 일치하는 해당 열거체의 상수를 반환
public class EnumMethodeTest {

	public static void main(String[] args) {
		//values : 열거체의 모든 상수를 저장한 배열을 생성하여 반환
		//ordinal : 열거된 순서를 정수 값으로 반환
		System.out.println("** values / ordinal **");
		for(Cur cur : Cur.values()) {
			System.out.println("ordinal : " + cur.ordinal() + "	" 
								+"상수값 : " +  cur + "	" 
								+"curCdNm : " + cur.curCdNm + "	"
								+"curCd : " + cur.curCd);
		}
		
		//valueOf : 전달된 문자열과 일치하는 해당 열거체의 상수를 반환
		System.out.println("** valueOf **");
		System.out.println(Cur.valueOf("KRW"));
		//System.out.println(Cur.valueOf("AGR"));	//IllegalArgumentException
		
	}
	
	public enum Cur {
		KRW("KRW", 1),	//한국
		USD("USD", 2),	//미국
		JPY("JPY", 3),	//일본
		CNY("CNY", 4),	//중국
		;

		private final String curCdNm;
		private final int curCd;
		
		Cur (String curCdNm, int curCd) {
			this.curCdNm = curCdNm;
			this.curCd = curCd;
		}
		
		public String getCurCdNm() {
			return curCdNm;
		}
		public int getCurCd() {
			return curCd;
		}
		
	}
}

 


실무에서 Enum을 활용

(1) String이나 int로 하드코딩했던 것들을 Enum으로 리팩토링한다.
(2) 변경되지 않는 국가코드, 통화코드등 어떤 코드들을 DB에서 저장해서 사용했던 것들을 Enum으로 변경해서 DB 쿼리를 최소화해 부하를 줄이는 방법 사용

예를 들어, 금융IT에서는 통화코드가 중요하다. 단순한 예로 통화가 KRW인경우와 USD인 경우를 생각해보자.
JAVA 로직에서 USD인경우에는 환율을 적용해야한다.
하드코딩 되어있던 통화코드들을 Enum class사용하여 직관적으로 수정할 수 있을 것이다.

public class EnumTest {

	public EnumTest() {
		
		// pre logic
		// DevLog 객체의 curCd에 통화코드 값이 할당되었다.
		DevLog devLog = new DevLog(1);
		
		/**
		 *  AS-IS
		 */
		//KRW
		if(devLog.curCd == 1) {
			
		}
		//USD
		else if(devLog.curCd == 2) {
			
		}
		//JPY
		else if(devLog.curCd == 3) {
			
		}
		//CNY
		else if(devLog.curCd == 4) {
			
		}
		
		/**
		 * TO-BE
		 */
		if(devLog.curCd == Cur.KRW.getCurCd()) {
			
		}
		else if(devLog.curCd == Cur.USD.getCurCd()) {
			
		}
		else if(devLog.curCd == Cur.JPY.getCurCd()) {
			
		}
		else if(devLog.curCd == Cur.CNY.getCurCd()) {
			
		}
	}

	public class DevLog{
		int curCd;
		
		DevLog(int curCd){
			this.curCd = curCd;
		}
	}
	
	public enum Cur {
		KRW("KRW", 1),	//한국
		USD("USD", 2),	//미국
		JPY("JPY", 3),	//일본
		CNY("CNY", 4),	//중국
		;

		private final String curCdNm;
		private final int curCd;
		
		Cur (String curCdNm, int curCd) {
			this.curCdNm = curCdNm;
			this.curCd = curCd;
		}
		
		public String getCurCdNm() {
			return curCdNm;
		}
		public int getCurCd() {
			return curCd;
		}
		
	}
}

기존에 하드코딩 되어있던 AS-IS소스를 TO-BE로 변경하는 예시이다.

좀더 직관적으로 보이는가?

 

프로그래밍을 하다보면 상수값을 사용하게 되게된다. 해당 상수값들의 특징들이 존재 할 것이다.

해당 상수들을 enum class를 통해 관리하게되면 유지보수에 용이하다.

유지보수에 용이하다는 장점은 엄청난 장점이다.

 

유지보수보다는 개발을 하고싶어하기에 많은 개발자들이 유지보수를 해본 경험이 없을 것이다.

하지만 모든 프로그램은 개발이 된 후 유지보수 및 운영이 이루어진다.

그 누군가는 해야만 하는 일이다.

또한 개인 프로젝트가 아닌 협업이기에 가독성도 중요하다.

 

개인적인 견해를 간략하게 적어보았다.

반응형

관련글 더보기

댓글 영역

>