반응형
정의
매직 넘버(Magic number)는 코드에서 상수(static final)로 선언하지 않은 하드 코딩된(literal value) 일정한 값을 의미하는 숫자나 문자열 등을 의미합니다.
상수(constant)란 수식에서 변하지 않는 값을 뜻한다. 이것은 변하는 값 변수와 반대이다.
모든 인용 출처
과제를 하면서 하드 코딩된 값들은 전부 상수처리하기 시작하면서 좀 더 고민하는 시간을 가지기로 했다.
- 정답은 없다고 생각하지만 자기가 주장하는 생각은 있어야 한다고 생각한다. (회사에 들어가면 코딩컨벤션이 있지 않을까 싶다.)
나의 의견과 맞는거 같아서 도움을 받아 결론을 낼 수 있었다.
단지 상수로 선언하지 않았다고 해서 매직 넘버나 매직 리터럴이 되는 것은 아니다.
의미 있는 상수는 무엇일까?
원주율은 원둘레와 지름의 비 즉, 원의 지름에 대한 둘레의 비율을 나타내는 수학 상수이다.
Java개발자 분들도 클래스의 정의해두신 걸 보면 이런 의미 있는 값들을 상수로 써야 된다고 생각할 수 있었다.
물론 우리가 프로그램을 작성할 때 이런 상수들만 있었으면 가져다 쓰지 왜 이런 고민을 할까?
- 나는 개발자 또한 고민속에서 자신만의 답을 도출하고 설계하는 엔지니어라고 생각한다.
경기도 의왕시! 지금은 많이 죽었지만 가구가 유명하기 때문에.. 예제를 만들어 봤습니다. 이케아, 오늘의집
상수는(static final) 말고도 열거형 클래스를 사용할 수 있는데요 이 예제를 생각한 만큼 여기에는 몇 가지 가정이 필요합니다.
의왕시 특정된 가게에서만 팔고 있는 제품이어야 됩니다.
- 이 이야기를 하는 것은 만약 의자라는 제품이 의왕시 전체의 제품이라면? 가게마다 의자의 가격이 다르면? 가게마다 할인 쿠폰이 있다면? 벌써 부터 고민할게 많아지겠네요... 즉, 고정된 값이라고 할 수 없기 때문에 이것은 상수가 아닌 변수다.
- 하지만 만들고 있는 서비스 자체가 "의왕시 특정된 가게에 홈페이지라면" 상수로 취급해도 된다고 생각합니다.
물론 우리는 DB를 사용하기 때문에 이런 고민은 안하겠지만 각자 환경이 다르고 서비스가 다르기 떄문에 이런 고민을 시작하면서 좋은 엔지니어가 되는게 아닐까 싶습니다.
의미없는 상수 변환
2주차 과제에서 고민없이 String클래스의 join메서드를 쓰는데 리터럴을 상수로 빼서 작성했습니다.
- 이번 과제를 하면서 상수의 기준이 무엇일까 고민하게 되었는데요ㅜㅜ
한 문장에서 많은걸 느꼈습니다.
, 쉼표라는 문자가 다른 사람이 봤을 때 이해할 수 없는 리터럴일까?
- Split 메서드에 들어가는 인자 COMMA라고 해요~🖐🏻 나 알죠??? 이런느낌 (상수)
- 나 지나간다. ???: 어어 콤마 왔구나 (리터럴)
즉 정리하면
이 ,(쉼표)를 COMMA와 같은 식으로 매직넘버를 상쇄하는 것은 의미없는 상수를 추가하는 것과 같다.
심지어 IDE.. 인텔리제이 가끔 마우스 안 먹는거 짜증나지만,,, (TIP: 한/영키 누르기)
regex에 들어가는 값이라고 가르쳐주고 저 메서드를 읽을 때도 쉽게 , 이 들어가는 구나 하고 다음줄을 읽을 수 있다고 생각한다.
상수로 처리 했을 때 문제점
", "반점 뒤에 스페이스가 있는지 확인하려면 상수의 어떤 값으로 들어갔는지 확인해야 되는 상황이 생긴다.
- 이것 또한 COMMA_SPACE_SPLIT 이런식으로 쓰면 되는거 아니에요?? 라고 하신다면 본인에 의견을 믿어주는 것도 좋다고 생각한다.
가장 큰 문제는 나 처럼 네이밍을 잘 작성 못하고 GPT없이는 효과적인 이름을 작성할 수 없는 사람들 많다면..
- 이게 무슨 뜻이지 하고 결국 마우스를 올려서 혹은 Enum으로 들어가서 값을 확인해 봐야되는 일이 생긴다.
그래서 나는 나름대로 생각해봤다!
여기서 변하는 값은 의왕시 예제를 생각하면 될거같다!!
참조
반응형
'개발' 카테고리의 다른 글
Getter 없이 Test해보기 (1) | 2023.11.24 |
---|---|
EnumMap 적용하기! (1) | 2023.11.08 |
1주 차 피드백을 2주 차 과제에 적용하기까지 (0) | 2023.11.01 |
원시 타입을 포장하자! (0) | 2023.10.31 |
Junit으로 Scanner, System.out.println() 테스트하기 (0) | 2023.10.25 |