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을 과도하게 사용하면 오히려 코드가 복잡해질 수 있어서, 상황에 맞게 적절한 상수 관리 방법을 선택하는 것이 중요하다고 느꼈다.
이젠 코드 안에 매직넘버를 적어 넣게 될 때, 불편함을 느끼게 됐고.
'우아한테크코스' 카테고리의 다른 글
[우테코 7기 프리코스 3주 차] 회고 (2) | 2024.11.14 |
---|---|
[우테코 7기 프리코스 3주 차] 트러블슈팅, 공통 피드백 (0) | 2024.11.10 |
[우테코 7기 프리코스 3주 차] MVC (3) | 2024.11.06 |
[우테코 7기 프리코스 2주 차] 회고 (0) | 2024.11.01 |
[우테코 7기 프리코스 2주 차] TDD (0) | 2024.10.31 |