현재 포스트는 예쁜 블로그 테마 Haon Blog 로 이전되었습니다. 지금보다 훨씬 예쁜 뷰에서 가독성 있는 글을 읽을 수 있습니다 🙂
최근 프리코스 문제를 풀이해보면서, 어떤 매직 넘버를 어떻게 상수로 분리하는지에 대한 많은 고민과 과정들이 있었습니다. 매직넘버, 상수란 무엇인지에 대해 다루며, 미션을 수행했을때 만든 내 기준에 대해 확고히 정리해보고자 합니다.
자바 프로그래밍을 하다보면 ( 나는 아직 자바 프로젝트를 제대로 해본적이 없지만...ㅎ) static final
키워드를 붙인 모습을 볼 수 있습니다. 왜 일반 변수를 단순히 선언하지 않고 굳이 위 키워드를 붙여서 사용할까요?
그 이유는 바로 상수화
를 하기 위함입니다. 상수화
를 진행하면 의미를 파악하기 힘들던 값도 가독성있게 읽기 좋은 코드로 변하게 됩니다.
예를들어 아래와 같은 코드를 봅시다.
public class BaseBall {
private final int number;
public BaseBall(int number) {
validateRange(number);
this.number = number;
}
private void validateRange(int number) {
if (number < 1 || number > 9) {
throw new IllegalArgumentException("~~");
}
}
// ...
}
위와같이 정의한 BaseBall 클래스 내부에서 숫자를 찾아봅시다. 바로 정답이 도출되겠지만, 1과 9라는 값이 도출됩니다. 하지만, 이 값이 무슨값을 의미하는걸까요? 이 질문에 대해 파악이 힘듭니다. "왜 number 라는게 1보다 작고, 9보다 커야하지?", "숫자가 의미하는게 뭐지" 와 같은 생각을 충분히 하게될 가능성이 존재합니다.
public class BaseBall {
private final int number;
public static final int MAX_NUMBER = 9;
public static final int MIN_NUMBER = 1;
public BaseBall(int number) {
validateRange(number);
this.number = number;
}
private void validateRange(int number) {
if (number < 1 || number > 9) {
throw new IllegalArgumentException("~~");
}
}
// ...
}
반면 위와 같이 1과 9를 MAX_NUMBER
, MIN_NUMBER
와 같이 상수화 시켜놓으면 어떻게 될까요? 다행히도 이전보단 가독성이 좋아지게 됩니다. 1과 9에 의미가 명확히 부여됨으로써, 사용자 입장에서는 "야구 숫자 값의 범위가 최소 1, 최대 9" 라는 값을 가져야만 한다는 요구사항이 있나보구나! 라고 파악이 빠르게 가능해집니다.
정리하자면, 상수화를 통해 의미를 파악하기 힘든 값에 대해 특별한 의미, 이름을 부여함으로써 "가독성" 을 높일 수 있습니다.
위에서 "상수화" 를 왜 하는지에 대한 이유, 근거를 살펴봤습니다. 그렇다면 매직넘버와 상수란 무엇인지에 대해 쉽게 이해가 가능해집니다.
우선 매직넘버란 의미있는 이름의 상수로 대체될 수 있는 숫자를 의미합니다. 앞선 BaseBall 클래스에서 특별한 의미없이 사용되던 숫자 "1", "9" 가 매직넘버가 될 것이며, 반대로 MAX_NUMBER
, MIN_NUMBER
가 바로 매직넘버가 상수화된 버전이 됩니다. 즉, static final
키워드를 통해 매직넘버를 상수화할 수 있게 됩니다.
코드에서 상수로 선언되어 있지 않은 숫자, 문자열은 무엇을 의미하는지 확신할 수 없습니다. 따라서 그 의미를 파악하기 위해 클래스를 이해하고, 코드의 흐름을 이해하기 위한 시간과 노력이 필요하게 됩니다.
이를 상수로 선언하게 됨으로써 불분명한 값들은 이름을 가지게 되며, 이름을 가지게 된 값은 그 이름만으로도 어떠한 역할을 하는지 알 수 있게 되는 것입니다.
어떤 상수화를 해야하는지에 대한 고민이 많았습니다. 그에 대해 내가 생각한 기준은 다음과 같습니다.
- 값 자체로써 의미가 있는 값만 상수화 시키자.
- 과한 상수화는 되려 가독성을 저하 시킬 수 있다.
에를들어 "for(int i=0; i<3; i++)" 과 같은 코드가 있다고 가정해보면,
"for(int i=ZERO; i<3; i++)" 로 상수화시키는 과정이 꼭 필요할까요? 값 자체가 의미있는 상수로 활용될 수 있다면 상수화시켜도 되겠지만, 이 경우는 불필요하다는 생각이 들었습니다. 되려 모든 값들을 상수화시키면 정작 중요한 상수 값들을 찾아내고 파악해는 것이 힘들것이라 생각합니다.
아직 개념들이 익숙치 않지만, 조금씩 해처나가 보고자 합니다. 공부할게 산더미이지만 😅 다음 주차도 열심히 배움을 이어가봐야 겠네요!