실습 과제 간 Enum 을 활용하여 작업해야 하는 과제가 있었는데, Enum에 대한 개념을 확실히 잡고가지 않아 어려움이 많았다.
그래서 이번 기회에 Enum을 확실히 잡고 넘어가기 위해 아래 정리하고자 한다.
Enum의 개념은 무엇인가?
- Enum은 상수 데이터들의 집합. 정해져 있는 한정된 데이터 묶음을 Enum으로 사용하면 보다 구조적으로 프로그래밍 할 수 있음
Enum은 어떤 구조인가?
- Enum 상수 하나당 자신의 인스턴스(객체)를 만들어 public static final 필드로 공개하는 것과 같다.
- 아래의 예시 코드를 통해 비교해보자
public enum Operator {
ADD, SUBTRACT, MULTIPLY, DIVIDE
}
가 내부적으로 어떤 구조로 되어있는가에 대해 확인해보자면
public final class Operator extends Enum<Operator> {
// 1. 상수(객체)
public static final Operator ADD = new Operator("ADD", 0);
public static final Operator SUBTRACT = new Operator("SUBTRACT", 1);
public static final Operator MULTIPLY = new Operator("MULTIPLY", 2);
public static final Operator DIVIDE = new Operator("DIVIDE", 3);
// 2. 모든 상수를 보관하는 배열
private static final Operator[] VALUES = { ADD, SUBTRACT, MULTIPLY, DIVIDE };
// 3. private 생성자 (외부에서 new 불가)
private Operator(String name, int ordinal) {
super(name, ordinal);
}
// 4. values(), valueOf() 메서드 자동 생성
public static Operator[] values() { return VALUES.clone(); }
public static Operator valueOf(String name) { ... }
}
각각의 객체를 생성하고, 배열에 그 상수가 보관되며 배열을 복사한 값으로 조회가 가능하도록 하게 하는 구조적인 특징을 볼 수 있다.
모든 enum은 자동으로 java.lang.Enum<T> 클래스를 상속하기 때문에 아래의 구조적인 내용들이 적용되는 것!
Enum은 어떻게 사용하는가?
- Enum은 크게 아래의 상황에서 활용되고 사용될 수 있다
① 값 비교 (== 연산자)
② 호출 / 출력
③ switch문 활용
④ 반복문에서의 활용
⑤ 연산 대체- 내가 진행하는 계산기 과제에서는 연산처리를 대체하는 부분까지 고려하여 enum을 활용해볼 예정
Enum이 제공하는 것은 무엇인가?
- 타입 안정성
- enum으로 정의된 값만 사용할 수 있음
- 잘못된 문자열이나 숫자는 컴파일 단계에서 막힘
- 자동 생성 메서드(내장 메서드)
| 메서드 | 설명 | 리턴 타입 |
| name() | 열거 객체의 문자열을 리턴 | String |
| ordinal() | 열거 객체의 순번(0부터 시작)을 리턴 | int |
| compareTo() | 열거 객체를 비교해서 순번 차이를 리턴 | int |
| valueOf(String name) | 문자열을 입력받아서 일치하는 열거 객체를 리턴 | enum |
| values() | 모든 열거 객체들을 배열로 리턴 | enum[] |
- 가독성 향상
- 기존 코드에서 숫자나 문자열 대신 의미있는 이름(상수) 사용
- 코드를 읽고 이해하기가 쉬워짐
- 자체 클래스 상속 (Enum<T>)
- 위의 예시에서도 설명했지만 모든 enum은 java.lang.Enum 클래스를 상속함
- 대신 이로 인해 다른 클래스를 상속받을 수 없음
- 공통 기능(비교, 이름 반환 등)을 기본으로 제공
- 위의 예시에서도 설명했지만 모든 enum은 java.lang.Enum 클래스를 상속함
Enum을 어디까지 확장해서 사용하는 것이 적절한가?
Enum은 크게 3가지의 확장성이 있다고 확인할 수 있었다.
① 단순 상수 집합 표현 : 방향, 상태, 요일, 연산자 등 한정된 선택지를 표현
public enum Direction { NORTH, SOUTH, EAST, WEST }
② 속성 추가를 한 형태 : 상수에 코드 값 / 설명 / 기호 같은 부가 정보를 붙일 때
public enum Operator {
ADD("+"), SUBTRACT("-");
private final String symbol;
Operator(String symbol) { this.symbol = symbol; }
public String getSymbol() { return symbol; }
}
③ 상수별 개념 및 행동 정의 : 각 상수가 다른 동작을 해야할 때
public enum Operator {
ADD { @Override public int apply(int a, int b) { return a + b; } },
SUBTRACT { @Override public int apply(int a, int b) { return a - b; } };
public abstract int apply(int a, int b);
}
➕ 모든 로직을 enum 안에서 구현하려고 하면 배보다 배꼽이 더 커지는 현상으로 가독성이 되려 더 떨어지게 될 수 있음을 유의 !
'JAVA' 카테고리의 다른 글
| [JAVA] 객체 지향 프로그래밍 개념 정리 (OOP) (0) | 2025.09.19 |
|---|---|
| [JAVA] JSP vs Thymleaf 개념 더 알아보기 (0) | 2025.09.19 |
| [JAVA] 자바 개념 확장 - Generic, Lambda, Stream, Thread (0) | 2025.09.17 |
| [JAVA] 자바 개념 확장 - Exception, Optional, Colletion (0) | 2025.09.17 |
| JAVA 객체지향 개념 정리 (1) | 2025.09.16 |