[우테코 7기 프리코스 3주 차] 상수

2024. 11. 7. 23:36우아한테크코스

 

상수 관리? 그게 꼭 필요해?

 

물론 자주 쓰게 되는 값을 저장해 두면 편리하다는 것은 알고 있었지만, 한 번 쓸 값까지도 다 정리해둬야 하나? 오히려 코드가 더 지저분해지고 불필요한 선언이 늘어나는 것 같았다.

 

 

좀 더 찾아보니, 개발을 진행하면서 매직 넘버(Magic Number)의 문제를 실감하게될 수도 있겠다는 생각이 들었다. 코드 중간중간에 의미를 알 수 없는 숫자나 문자열이 나타나면, 그 값이 무엇을 의미하는지 파악하기 어렵고, 협업 시 다른 사람이 코드를 읽을 때 이해하기 힘들 것 같았다. 또한, 나중에 요구사항이 변경되어 그 값을 수정해야 할 때 여러 곳을 일일이 찾아서 수정해야 하는 번거로움도 예상되었다. 

 


 

파일 최상단에 상수 선언하기

 

 

그래서 처음에는 파일 최상단에 final 상수로 정리해 두었다.

public class Lotto {
    private static final int LOTTO_NUMBER_MIN = 1;
    private static final int LOTTO_NUMBER_MAX = 45;

    private List<Integer> numbers;

    public Lotto() {
        this.numbers = generateNumbers(LOTTO_NUMBER_MIN, LOTTO_NUMBER_MAX);
    }
    // ...
}

 

이렇게 하니 한 클래스 내에서는 상수를 관리하기 편했다. 그러나 프로젝트가 커지면서 다른 클래스에서도 동일한 상수를 필요로 하게 되었다. 예를 들어, 로또 번호를 생성하는 클래스에서도 LOTTO_NUMBER_MIN과 LOTTO_NUMBER_MAX가 필요했다. 중복된 상수 선언은 유지보수에 문제가 될 수 있었다.

 


 

상수 클래스로 관리하기

 

 

그래서 상수를 한 곳에서 관리하기 위해 상수를 모아둘 전용 클래스를 만들었다.

public class LottoConstants {
    public static final int LOTTO_NUMBER_MIN = 1;
    public static final int LOTTO_NUMBER_MAX = 45;
    public static final int LOTTO_NUMBER_COUNT = 6;
    // ...
}

 

이렇게 하니 프로젝트 전반에서 공통으로 사용하는 상수들을 한 곳에서 관리할 수 있어서 편리했다. 필요한 곳에서 LottoConstants.LOTTO_NUMBER_MAX로 가져와서 사용하면 되니 중복도 없앴다.

하지만 시간이 지나면서 상수 클래스가 점점 비대해지고, 관련성이 적은 상수들까지 한 곳에 모이는 문제가 생겼다. 이는 코드의 응집도를 떨어뜨리고, 필요한 상수를 찾기도 어려워졌다.

 


 

enum 활용하기

 

 

enum을 사용하면 연관된 상수들을 그룹화하고, 각 상수에 관련된 속성과 메서드를 부여할 수 있었다.

public enum Rank {
    FIRST(6, 2_000_000_000),
    SECOND(5, 30_000_000),
    THIRD(5, 1_500_000),
    FOURTH(4, 50_000),
    FIFTH(3, 5_000),
    MISS(0, 0);

    private final int matchCount;
    private final int prize;

    Rank(int matchCount, int prize) {
        this.matchCount = matchCount;
        this.prize = prize;
    }

    public int getMatchCount() {
        return matchCount;
    }

    public int getPrize() {
        return prize;
    }
}

 

enum을 사용하니 각 등수에 대한 정보와 행위를 하나의 객체로 관리할 수 있었다. 등수별로 일치하는 번호 개수와 상금을 명확하게 정의할 수 있고, 추후에 당첨 결과를 계산하는 로직도 깔끔하게 구현할 수 있었다.

 


 

마무리

 

 

모든 상수를 enum으로 관리하는 것이 항상 최선은 아니라는 생각이 든다. enum은 서로 연관된 상수들을 그룹화하고, 그에 따른 속성이나 행위를 정의하는 데 적합하지만, 단순한 상수는 클래스 상단에 static final로 관리하는 편이 더 효율적으로 보인다. enum을 과도하게 사용하면 오히려 코드가 복잡해질 수 있어서, 상황에 맞게 적절한 상수 관리 방법을 선택하는 것이 중요하다고 느꼈다.

 

이젠 코드 안에 매직넘버를 적어 넣게 될 때, 불편함을 느끼게 됐고.