매직 리터럴(매직 넘버)란?
매직 리터럴(매직 넘버)
: 프로그래밍에서 비즈니스적 의미를 가진 숫자나 문자를 그대로 표현한 것.
(단, 의미 없는 선언 또는 함수 하나에만 쓰이고 그 함수가 맥락 정보를 충분히 제공한다면 상수로 바꿔 사용하는 것에 이득이 없습니다.)
매직 리터럴 예시
public final class PositiveNumber {
private final int value;
public PositiveNumber(int value) {
if (value < 1) { // 1은 매직 리터럴입니다.
throw new IllegalArgumentException(String.format("value(%d)는 0 또는 음수가 될 수 없습니다.", value));
}
this.value = value;
}
}
Java
복사
매직 리터럴의 문제점
•
매직 리터럴은 단순히 코드만 보았을 때, 작성한 사람이 아니라면 그 의미를 파악하기 힘듭니다.
•
코드의 가독성이 낮아져 비용이 증가하고, 결국에는 유지보수성을 저하시키는 원인이 됩니다.
매직 리터럴의 리팩터링
•
매직 리터럴은 다음과 같은 방식으로 리팩터링합니다.
•
원하는 방식을 선택해서 적용해도 좋고, 중복으로 선택 적용해도 좋습니다.
1. 상수 선언 방식
: 매직 리터럴은 의미를 알기 쉬운 이름으로 상수로 선언하여 사용합니다.
public final class PositiveNumber {
private static final int MINIMUM_POSITIVE_NUMBER = 1; // 상수 선언
private final int value;
public PositiveNumber(int value) {
if (value < MINIMUM_POSITIVE_NUMBER) {
throw new IllegalArgumentException(String.format("value(%d)는 0 또는 음수가 될 수 없습니다.", value));
}
this.value = value;
}
}
Java
복사
2. 메서드 추출 방식
: 의미가 불분명한 단위의 로직을 의미있는 네이밍 메서드로 고립시키는 방식을 적용합니다.
public final class PositiveNumber {
private final int value;
public PositiveNumber(int value) {
if (isNotPositiveNumber(value)) { // 메서드 추출
throw new IllegalArgumentException(String.format("value(%d)는 0 또는 음수가 될 수 없습니다.", value));
}
this.value = value;
}
private boolean isNotPositiveNumber(int value) {
return value < 1;
}
}
Java
복사
3. Enum 활용
public final class PositiveNumber {
private final int value;
public PositiveNumber(int value) {
if (value < IntegerConstant.MIN_POSITIVE_NUMBER.value()) { // enum 사용
throw new IllegalArgumentException(String.format("value(%d)는 0 또는 음수가 될 수 없습니다.", value));
}
this.value = value;
}
}
public enum IntegerConstant {
MIN_POSITIVE_NUMBER(1),
MAX_POSITIVE_NUMBER(Integer.MAX_VALUE);
private final int value;
IntegerConstant(int value) {
this.value = value;
}
public int value() {
return value;
}
}
Java
복사