BackEnd/Java

[Java] Enum(열거형)과 상수

ryuneng 2025. 1. 16. 00:04
반응형

# 목적

: JAVA의 Enum(열거형)과 상수에 대한 학습




Enum 이란?

: 상수값(상수 데이터)의 집합 미리 값이 정해져 있는 한정된 데이터의 묶음, 상수의 단점을 보완

ex)
- 고객등급 : Gold, Silver, Bronze
- 학   점 : A, B, C, D, F
- 계   절 : 봄, 여름, 가을, 겨울
- 등급별 포인트 적립률 : Gold(0.05), Silver(0.02), Bronze(0.01)

- Enum의 형식

enum 열거형이름 {
	상수, 상수, 상수;
}

* 열거형이름 : 클래스이름처럼 첫번째 글자를 대문자로 하고, 나머지는 소문자로 작성
* 상수 : 전부 대문자로 작성, 두 단어 이상의 조합일 때에는 "_"로 연결함


- 열거형 정의하기

// 1.
public enum Grade {
	GOLD, SILVER, BRONZE; // 열거형은 상수값이라서 대문자로 작성함
}

// 2.
public enum Grade {
	A(4.5), B(3.0), C(2.0), D(1.0), F(0.0);
}




Enum의 장점

1. 허용가능한 값들을 제한함

* 열거형 상수가 특정 열거타입에 포함되어 있기 때문에, 열거형 변수에 대입가능한 값은 해당 열거형의 열거상수들 뿐

ex)

// 열거형이 아닐 때
static final int GOLD = 1;
static final int SILVER = 2;
int customerGrade = GOLD;
int customerGrade = 100; // 고객등급과 상관없는 값이 대입되어도 에러가 발생하지 않음

// 열거형일 때
enum Grade {
	GOLD, SILVER, BRONZE;
}
Grade grade = Grade.GOLD;
Grade grade = 100;		// 컴파일 오류 발생

2. 개발도구(Eclipse, Intellij) 의 자동완성, 문법오류 체크 등을 지원받을 수 있음

3. 조건식에서 ==으로 비교 가능, switch문에서도 바로 사용 가능




Enum의 주요 내장 메소드

  1. String name()
    > 열거객체가 가지고 있는 문자열을 반환함
    > 문자열은 열거상수의 이름과 동일함
  2. int ordinal()
    > 열거객체의 순번(0번부터 시작하는)을 반환함
  3. int compareTo(enum other)
    > 지정된 열거객체와 순번을 비교해서 정수값을 반환함
    > 전달받은 다른 열거객체의 순번보다 빠르면 음수 반환, 순번이 늦으면 양수 반환
  4. enum valueOf(String name)
    > 매개변수로 전달받은 문자열과 동일한 이름을 가지는 열거객체를 생성해서 반환함
    * 다른 형태로 가져올 때 사용 ex) DB에서 문자열로 받아올 때
  5. enum[] values()
    > 해당 열거형의 모든 열거상수들에 대한 열거객체를 배열로 반환함

  6. * name(), valueOf() 관계 열거객체 ---> 문자열 Grade.GOLD name() "GOLD" 문자열 ---> 열거객체 "GOLD" Grade.valueOf("GOLD") Grade.GOLD



* Enum과 상수값 매핑하기

enum ScoreGrade {
	수(90), 우(80), 미(70), 양(60), 가(50);
    
    // 1. 상수 : 고유한 값
    private int score;
    
    // 2. 생성자 : 외부에서 객체생성하지 못하게 private (default생성자 허용x)
    private ScoreGrade(int score) {
    	this.score = score;
    }
    
    // 3. Getter : 고유한 값을 조회하기 위해 생성, 값을 바꾸지 못하도록 Setter는 제공x (상수이기 때문에)
    public int getScore() {
    	return score;
    }
}




상수 란?

- 프로그램이 실행되는동안 변하지 않는 값 (미리 값이 정해진 데이터)
- 상수 정의하기 (public static final 타입 상수명 = 값;)
ex)

public class Constants {
	public static final int GOLD = 1;
    public static final int SILVER = 2;
    public static final int BRONZE = 3;
    
    public static final double GOLD_POINT_DEPOSIT_RATE = 0.05;
    public static final double SILVER_POINT_DEPOSIT_RATE = 0.02;
    public static final double BRONZE_POINT_DEPOSIT_RATE = 0.01;
    
    public static final long MAX_UPLOAD_SIZE = 1024*1024*10;
    public static final long MAX_TIME_OUT = 60*60*1000; // 1시간을 나타내는 밀리초 단위
}


상수를 정의하는 목적

1. 가독성 향상

// 상수를 사용하지 않은 경우
public int getDepositPoint(int customerGrade, int amount) {    
	if (customerGrade == 1) {
    	return (int) (amount*0.05);
    } else if (customerGrade == 2) {
    	return (int) (amount*0.02);
    } else if (customerGrade == 3) {
    	return (int) (amount*0.01);
    }
    return 0;
}

// 상수를 사용한 경우 - 가독성 향상
public int getDepositPoint(int customerGrade, int amount) {    
	if (customerGrade == Constants.GOLD) {
    	return (int) (amount*0.05);
    } else if (customerGrade == Constants.SILVER) {
    	return (int) (amount*0.02);
    } else if (customerGrade == Constants.BRONZE) {
    	return (int) (amount*0.01);
    }
    return 0;
}

2. 유지보수성 향상

1) 위의 상수란? > 상수 정의하기 ex) 에서 Constants의 상수값을 변경하기만 하면 해당 상수값을 사용하는 모든 클래스에 변경된 값이 적용됨

2) 상수값들간에 상관관계가 있는 경우 2배, 3배, 1/2배 등... 상수값을 그 상관관계를 표현하는 식으로 작성
ex)

final double GOLD_DEPOSIT_RATE = 0.1;
final double SILVER_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/2;
final double BRONZE_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/4;
final double GUEST_DEPOSIT_RATE = GOLD_DEPOSIT_RATE/8;

 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Java-Enum-열거형