✅ Enum이란?
코딩을 작성할때 우리는 대부분 이런식으로 상수를 정의한다.
final static int A = 0;
String B = "abc";
이렇게 정의를 하다보면 다양한 문제가 발생한다.
그래서 자바 1.5버전부터 새로 추가된 클래스는 " Enum " 이다.
enumerated type 의 줄임말로 열거형이라고 불리는데 명명된 값들의 집합을 이루는 자료형이다.
ex)
boolean -> (true,false)
예를 들면 boolean도 열거형 데이터 타입이다.
이렇듯 사용자가 직접 Enum 클래스를 활용해 열거형 데이터 타입을 정의 할 수 있다.
✅ Enum의 장점
1. 리팩토링(유지보수)를 할 때 변경 범위가 최소화된다. 즉,내용을 추가할때 Enum 코드만 수정해도 될 때가 많다.
2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다.
3. 코드의 가독성이 향상된다.
4. 일반 클래스와 마찬가지고 메서드를 가질 수 있다. 이를 통해 열거형 값에 의한 동작을 정의하고, 상태에 따라 다르게 동 작 시킬 수 있다.
✅ Enum 메소드
Static Methods |
valueOf(String arg) | String 값을 enum에서 가져옴. 값이 없으면 예외 발생 |
valueOf(Class<T> class, String arg) | 넘겨받은 class에서 String찾아, enum에 가져옴. valueOf(String arg)는 내부적으로 자기자신 Class를 가져옴. |
|
values() | eum의 요소들을 순서대로 enum타입의 배열로 리턴. |
✅ Enum 사용법
기본적으로 가장 많이 사용하는 valueOf(String arg)를 이용한 예제를 알아보자.
package calculate;
//연산자의 종류를 정의하는 열거형 클레스
public enum OperatorType {
ADD("+"),
SUBTRACT("-"),
MULTIPLY("*"),
DIVIDE("/");
private final String symbol; //입력받을 연산자 기호
private final Calculate calculate = new Calculate();
//생성자:연산자 기호 설정
OperatorType(String symbol) {
this.symbol = symbol;
}
//연산자의 기호를 반환하는 게터
public String getSymbol() {
return symbol;
}
//입력받은 기호와 동일한 연산자 타입을 찾는 메서드
public static OperatorType matchOperatorType(char symbol) {
for (OperatorType operatorType : OperatorType.values()) { //모든 Enum값 순환
if (operatorType.getSymbol().charAt(0) == symbol) { //일치하는지 확인
return operatorType;
}
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
//첫번째 숫자와 두번쨰숫자의 연산을 수행하는 메서드
public int operate(int firstNumber, int secondNumber) {
if(ADD.getSymbol().equals(symbol)) {
return calculate.Add(firstNumber,secondNumber);
}
if(SUBTRACT.getSymbol().equals(symbol)) {
return calculate.Sub(firstNumber,secondNumber);
}
if(MULTIPLY.getSymbol().equals(symbol)) {
return calculate.Mul(firstNumber,secondNumber);
}
if(DIVIDE.getSymbol().equals(symbol)) {
return calculate.Div(firstNumber,secondNumber);
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
}
1.Enum 정의
4가지의 연산자를 문자열 기호를 심볼로 사용하여 정의했다.
//연산자의 종류를 정의하는 열거형 클레스
public enum OperatorType {
ADD("+"),
SUBTRACT("-"),
MULTIPLY("*"),
DIVIDE("/");
2.필드 정의
입력받는 메인 클래스에서 값을 가져와 저장할 symbol 과 연산클래스들을 가져 올 클래스 객체를 생성한다.
private final String symbol; //입력받을 연산자 기호
private final Calculate calculate = new Calculate();
3.생성자와 Getter 메소드
Enum의 인스턴스를 생성하기 위한 생성자 호출과 symbol을 반환하는 Getter 를 작성한다.즉,해당 Symbol을 외부에서 접근할 수 있도록 하는 메소드이다.
//생성자:연산자 기호 설정
OperatorType(String symbol) {
this.symbol = symbol;
}
//연산자의 기호를 반환하는 게터
public String getSymbol() {
return symbol;
}
4.입력한 연산자와 동일한 Enum심볼을 비교하는 메소드
values 문법을 이용해 OperatorType 의 enum 모든 값을 순회하고 입력한 symbol 과 동일한 값을 return 한다.
//입력받은 기호와 동일한 연산자 타입을 찾는 메서드
public static OperatorType matchOperatorType(char symbol) {
for (OperatorType operatorType : OperatorType.values()) { //모든 Enum값 순환
if (operatorType.getSymbol().charAt(0) == symbol) { //일치하는지 확인
return operatorType;
}
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
5. 현재 연산자에 따라 두 숫자를 사칙연산하는 메소드
연사자별 심볼을 가져와서 입력한 심볼과 비교하여 계산클래스의 연산메소드를 불러온다.
//첫번째 숫자와 두번쨰숫자의 연산을 수행하는 메서드
public int operate(int firstNumber, int secondNumber) {
if(ADD.getSymbol().equals(symbol)) {
return calculate.Add(firstNumber,secondNumber);
}
if(SUBTRACT.getSymbol().equals(symbol)) {
return calculate.Sub(firstNumber,secondNumber);
}
if(MULTIPLY.getSymbol().equals(symbol)) {
return calculate.Mul(firstNumber,secondNumber);
}
if(DIVIDE.getSymbol().equals(symbol)) {
return calculate.Div(firstNumber,secondNumber);
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
Enum을 전체적인 프로젝트에 어떻게 적용하는지 보고 싶다면
https://computerreport.tistory.com/46
[Java]Lv3 계산기 만들기
https://computerreport.tistory.com/45 [Java]Lv2 계산기 만들기https://computerreport.tistory.com/44 [Java]Lv1 계산기 만들기문제1. 양의 정수(0포함)를 입력받기 2. 사칙연산기호(+,-,*,/)를 입력 받기 3. 위에서 입력받
computerreport.tistory.com
해당 링크를 통해 Lv1,2,3를 차근차근 보면 된다.
프로젝트를 진행하면서 Enum의 장점을 잘 활용한다면 코드의 간소화와 가독성을 높이고 팀협업을 더 수월하게 할 수 있을 것이다.
간단한 코드라도 직접 적용해보고 익숙하게 만드는 것이 관건이다.
감사합니다

'Java' 카테고리의 다른 글
[Java]문자열을 배열로 변환하는 방법 (0) | 2025.03.06 |
---|---|
[Java]valueOf()를 이용한 형변환 (0) | 2025.03.04 |
[Java]코드 스타일 및 명명 규칙 (0) | 2025.02.24 |
[Java]난수 생성(math,Random) (0) | 2025.02.14 |
[Java]ArrayList (0) | 2025.02.11 |