본문 바로가기
프로그래밍이야기/Java

[Java] 상수를 활용하자

by 사랑꾼이야 2022. 3. 20.
반응형

상수의 활용

읽기 쉬운 코드를 작성하기 위한 노력 중의 하나로 매직 넘버 대신 상수를 활용하고 있습니다.
일각에서는 상수를 사용함으로 코드가 길어져서 오히려 가독성을 해치는 것이 아니냐고 하는 경우도 있습니다.

유지보수를 하는 입장에서 생각을 해본다면,

  • 의미 있는 상수로 인하여 코드의 길이는 조금 길어졌지만 가독성은 있는 경우
  • 매직 넘버로 인해 코드의 길이는 조금 짧아졌지만 무슨 내용인지 모르는 경우

후자보다는 전자의 경우가 조금 더 나은 상황이라는 생각이 듭니다.

후자를 선택해서 개발을 하다가 매직 넘버를 만나게 되었는데, 그 의미를 파악했다 하더라도 진짜 그 의도가 맞는지 담당자에게 확인해봐야 하는 커뮤니케이션 비용도 들어가게 됩니다.

사실, 매직 넘버 대신 상수를 잘 활용하기 위해서는 네이밍룰을 정하는 것이 제일 먼저라고 생각합니다. 각 회사에서 사용하는 개발팀내 컨벤션은 각각 다르기 때문에 내부 규칙을 따르는 것이 맞고, 아직 컨벤션이 정립되지 않았다면 다음 규칙을 활용해보시는 것도 좋을것 같습니다.

그러면 매직 넘버의 대해서 알아보고 상수의 활용에 대해서 정리해보도록 하겠습니다.

매직넘버

프로그래밍에서 매직 넘버는 코드에서 직접 사용되는 숫자값입니다.
예를 들어 다음과 같은 숫자들입니다.

@DisplayName("달력 테스트")
@Test
void getMonth() {
    // 현재날짜에서 월 추출
    final Month cur_month = LocalDate.now().getMonth();
    final List<String> monthList = new ArrayList<>();
    Month startMonth = cur_month.minus(7);

    for (int i = 0; i <= 7; i++) {
        monthList.add(i, String.valueOf(startMonth.getValue()));
        startMonth = startMonth.plus(1);
    }
    System.out.println("monthList = " + monthList);
}

특징

  • 매직 넘버hard-coded 숫자값입니다.
    • 위에 예시에서 7, 1 값입니다.
  • 매직 넘버는 문맥 또는 의미를 갖고 있지 않습니다.
    • 71은 어떠한 문맥이나 의미를 갖고 있지 않습니다.

매직 넘버 사용을 피해야 하는 이유

  • 코드를 이해하고 유지하기 어렵게 만드는 안티 패턴입니다.
    • 71 만 보고서는 이 숫자값들이 어떠한 의미를 갖고 프로그램안에서 동작하는지 알 수가 없습니다.
  • 의도가 명확하지 않아서 코드를 변경하기가 더 어려워집니다.
    • 의미를 알 수 없기 때문에 수정하는 것이 두렵습니다.

상수의 사용

매직 넘버를 사용하는 대신 값을 나타내기 위해 상수를 사용하는 것이 좋습니다. 상수를 잘 사용하면 코드의 가독성을 향상시키고 의미를 쉽게 파악할 수 있기 때문에 유지보수 비용이 줄어듭니다.

public static final int INT_LATEST_CUR_MONTHS_COUNT = 7;
public static final int INT_INCREASE_ONE_MONTH = 1;

@DisplayName("달력 테스트")
@Test
void getMonth() {
    // 현재날짜에서 월 추출
    final Month cur_month = LocalDate.now().getMonth();
    final List<String> monthList = new ArrayList<>();
    Month startMonth = cur_month.minus(INT_LATEST_CUR_MONTHS_COUNT);

    for (int i = 0; i <= INT_LATEST_MONTHS_COUNT; i++) {
        monthList.add(i, String.valueOf(startMonth.getValue()));
        startMonth = startMonth.plus(INT_INCREASE_ONE_MONTH);
    }
    System.out.println("monthList = " + monthList);
}

상수의 작성 예시

상태를 가지지 않는 자료형이면서, static final로 선언되어 있는 필드를 나타냅니다. 상수 이름은 대문자로 작성하며, 복합어는 언더스코어(_)를 사용하여 단어를 구분합니다.

// 로또 번호 최소값 (1)
private static final int INT_LOTTO_NUMBER_MINIMUM = 1;
// 로또 번호 최대값 (45)
private static final int INT_LOTTO_NUMBER_MAXIMUM = 45;
// 로또 숫자 6개
private static final int INT_LOTTO_SIZE = 6;

마무리

  • 의미가 불분명한 매직 넘버 대신 의미 전달이 명확한 상수를 활용하자
  • 0, 1과 같은 매직 넘버에 ZERO, ONE 으로 의미 없는 상수는 사용하지 말자
반응형

댓글