매직 넘버(Magic Number)란?
매직 넘버(Magic Number) 란, 코드 안에서 의미 없이 하드코딩된 숫자 값을 말함.
즉, 설명이 없이 갑자기 등장하는 "숫자 상수" 로, 코드의 의미를 모호하게 만들고 유지보수를 어렵게 함.
1. 매직 넘버 예시
public double getCircleArea(double radius) {
return radius * radius * 3.14159; // ← 3.14159가 매직 넘버
}
위 코드에서 3.14159 는 "왜 저 숫자가 사용되었는지" 를 설명하지 않기 때문에
다른 사람이 볼 때 의미를 파악하기 어렵고, 실수로 수정하거나 복사/붙여넣기 시 오류를 유발할 수 있음.
2. 매직 넘버가 문제되는 이유
문제 | 설명 |
가독성 저하 | 숫자의 의미를 알기 어렵고, 코드의 목적이 불명확함 |
유지보수 어려움 | 여러 곳에 중복된 숫자를 수정할 때 누락이나 실수 가능성 존재 |
버그 발생 가능성 | 잘못된 숫자 변경으로 인한 논리 오류 발생 위험 있음 |
리팩토링 어려움 | 추후 요구사항 변경 시 의미 파악이 안 돼 리팩토링이 어려움 |
3. 매직 넘버를 제거하는 방법
→ 의미 있는 이름의 상수로 선언하여 관리함
public class GeometryUtils {
private static final double PI = 3.14159;
public double getCircleArea(double radius) {
return radius * radius * PI;
}
}
이렇게 하면:
- 숫자의 의미를 명확히 전달할 수 있음
- 유지보수 시 상수 하나만 바꾸면 모든 코드에 반영됨
- 가독성과 안정성이 모두 향상됨
4. 매직 넘버 제거 시점 기준
무조건 모든 숫자를 상수화할 필요는 없으며, 다음과 같은 기준으로 판단하면 좋음:
제거 대상 | 설명 |
의미 있는 값 | 3.14159(원주율), 60(초→분 변환), 1024(1KB) 등은 반드시 상수화 |
반복적으로 사용되는 값 | 3번 이상 반복되면 상수화 고려 |
변경 가능성 있는 값 | 향후 바뀔 가능성이 있는 값은 상수로 뽑아야 함 |
도메인 상 의미를 가지는 값 | 상태 코드(200, 500), 타입 구분(1:관리자, 2:사용자 등)은 열거형(enum) 사용 권장 |
5. enum을 사용한 매직 넘버 제거
숫자 대신 enum을 활용하여 명확한 의미를 부여할 수 있음
public enum UserType {
ADMIN(1),
USER(2),
GUEST(3);
private final int code;
UserType(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
→ 이렇게 하면 코드의 의도와 의미를 동시에 표현할 수 있음
6. 매직 넘버와 관련된 코드 품질 원칙
- Clean Code 원칙
- "의도를 드러내는 이름"을 사용하여 숫자의 의미를 명확히 표현해야 함
- 리터럴 상수 최소화
- 하드코딩된 숫자는 되도록 상수 또는 enum으로 치환해야 함
- SOLID 중 OCP(Open-Closed Principle)와 관련
- 숫자를 상수화하면 변경에 닫혀 있고, 확장에 열려 있는 구조로 유연성이 높아짐
정리
매직 넘버는 코드 안에 의미 없이 하드코딩된 숫자 값을 말하며,
가독성과 유지보수성을 떨어뜨리고 버그 발생 위험을 높임.
이를 해결하려면 상수화, 의미 있는 변수명, enum 사용 등을 통해
숫자에 도메인적 의미를 부여하고 변경 가능성을 통제해야 함.
출처 : ChatGPT