자바에서 관련된 상수의 집합을 정의하는 클래스
상수 값을 그룹화하고 타입을 안전하게 보장한다.
요일, 월 등 고정된 값 집합을 표현하거나 상태 머신에서 특정한 상태를 나타낼 때 사용하며 코드의 가독성과 유지보수성을 높일 수 있다.
내부 메서드를 사용하면 상수의 특성에 따라 각각 다른 동작을 수행할 수 있고, 각 상수의 동작을 구현하거나 해당 상수의 속성을 반환할 수 있다.
전략 패턴
행위를 캡슐화하여 동적으로 변경할 수 있도록 설계하는 방식이다.
각각의 클래스(전략)로 캡슐화하여, 특정 클래스의 행위를 유연하게 바꿀 수 있다. 코드의 재사용성과 확장성을 높이는 데 유용
- Context : 전략을 사용하는 클래스로 외부에서 전략을 주입받아 실행한다.
- Strategy : 공통 인터페이스 또는 추상 클래스로, 여러 전략 클래스가 동일한 방식으로 호출될 수 있도록 메서드를 정의한다.
- ConcreteStrategy : 전략을 구현한 구체 클래스
enum과 전략 패턴
전략 패턴을 사용하여 각 상수마다 별도의 전략을 정의하고 이것을 enum 내부의 메드에서 사용하여 다양한 동작을 수행할 수 있다.
전략 패턴을 사용함으로써 각 상수의 동작을 쉽게 확장하고 유연하게 변경할 수 있다. 다른 인터페이스를 구현하거나 다른 클래스와 상호작용하는 경우 해당 인터페이스나 클래스를 전략 패턴에 포함하여 각 상수의 동작을 정의할 수 있다.
// Strategy 인터페이스 정의
public interface Operation {
double apply(double a, double b);
}
// Enum 전략 정의
public enum Calculate implements Operation {
ADD {
@Override
public double apply(double a, double b) {
return a + b;
}
},
SUBSTRACT {
@Override
public double apply(double a, double b) {
return a - b;
}
},
MULTIPLY {
@Override
public double apply(double a, double b) {
return a * b;
}
},
DIVIDE {
@Override
public double apply(double a, double b) {
if (b == 0) throw new ArithmeticException("Division by zero");
return a / b;
}
};
}
// Context 사용
public class CalculatorExample {
public static void main(String[] args) {
double a = 10, b = 5;
// ADD 연산 수행
double result = Calculator.ADD.apply(a, b);
System.out.println("Result: " + result);
// SUBTRACT 연산 수행
result = Calculator.SUBTRACT.apply(a, b);
System.out.println("Result: " + result);
}
}
각 enum 상수는 연산의 이름과 전략 로직을 모두 포함한다. 새로운 연산 추가 시 enum에 상수를 추가하고 apply 를 구현하면 된다.
전략을 enum 내부에 정의하여 별도의 클래스 없이 전략을 관리할 수 있고, 관련 로직을 enum 안에 두어 코드 가독성이 높다.
새로운 전략을 추가할 때 기존 코드의 변경 없이 새로운 enum 상수를 추가하면 되어 확장이 용이하다.
하지만 enum 내부에 너무 많은 전략이 포함되면 코드가 복잡해질 수 있다.
enum이 너무 많은 역할을 갖지 않도록 하자.
'Java' 카테고리의 다른 글
Process와 Thread (2) | 2025.01.07 |
---|---|
String 객체 선언하기 (0) | 2025.01.06 |
동등성과 동일성 (0) | 2025.01.06 |
Primitive 타입과 Reference 타입 (0) | 2025.01.06 |
오버로딩과 오버라이딩 (0) | 2025.01.06 |