Search

매직 리터럴(매직 넘버)을 다루는 법

Created time
2022/04/20 13:31
Modified
2022/11/14 12:59
Tags
java

매직 리터럴(매직 넘버)란?

매직 리터럴(매직 넘버) : 프로그래밍에서 비즈니스적 의미를 가진 숫자나 문자를 그대로 표현한 것. (단, 의미 없는 선언 또는 함수 하나에만 쓰이고 그 함수가 맥락 정보를 충분히 제공한다면 상수로 바꿔 사용하는 것에 이득이 없습니다.)

매직 리터럴 예시

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
복사