노트

매직 넘버와 설명 상수

Magic Number and Explaining Constant

설계#refactoring · 연결된 개념 9개

쉽게 말하면

매직 넘버는 회의 메모에 '3'이라고만 적힌 것과 같아요. 3층인지 3시인지 세 명인지 모르니, '회의 시작 시각 3시'처럼 이름을 붙여 두면 읽는 사람이 추측하지 않아도 돼요.

비유가 깨지는 곳 숫자가 같다고 같은 이름으로 묶으면 안 돼요. 우연히 값이 같은 두 상수를 하나로 합치면 한쪽만 바뀔 때 버그가 나고, 값의 종류가 정해져 있다면 Enum이 더 나아요.

뜻이 드러나지 않는 리터럴 값이 코드에 박혀 있는 것을 매직 넘버(Magic Number) 또는 매직 리터럴(Magic Literal)이라 한다. 의미를 담은 이름의 상수로 바꾸면 코드가 스스로 뜻을 말한다.

// before
if (response.status === 404) ...
const energy = mass * 9.81 * height
 
// after
const NOT_FOUND = 404
const STANDARD_GRAVITY = 9.81
if (response.status === NOT_FOUND) ...
const energy = mass * STANDARD_GRAVITY * height
  • 의미를 이미 안다고 해도 각자 머리에서 해석한 것일 뿐이다. 코드에 적혀 있는 편이 낫다
  • 주의: 값이 같아도 뜻이 다르면 같은 상수로 묶지 않는다. 우연히 같은 숫자를 하나로 묶으면 한쪽만 바뀔 때 버그가 된다
  • 상수가 여러 개 생기면 관련된 것끼리 모아 두는 정리가 이어진다(응집 순서)
  • 값의 종류가 정해져 있다면 상수 대신 열거 타입(Enum)이 낫다(enum과 as const 객체)

켄트 벡은 이 정리를 Explaining Constants(한국어판 "설명하는 상수")라 부르고 설명 변수와 나란히 둔다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Magic Literal · Refactoring.Guru: Replace Magic Number with Symbolic Constant · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

  • 특이 케이스와 널 객체

    특정 값(가장 흔하게는 null이나 "미확인" 같은 표시값)을 만날 때마다 같은 처리를 하는 코드가 곳곳에 흩어져 있을 때, 그 경우를 대표하는 객체를 하나 만들어 공통 동작을 담는 패턴. null을 대표하면 널 객체(Null Object)라 부르며, 널 객체는 특이 케이스(Special Case)의 한 예다.

  • 함수 선언 바꾸기

    함수의 이름이나 매개변수 목록을 바꾸는 리팩터링. 가장 자주 쓰는 리팩터링이 이름 바꾸기인 것은, 이름이 코드를 명료하게 하는 가장 큰 도구이기 때문이다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 임시 변수를 질의 함수로 바꾸기

    계산 결과를 담아 두던 임시 변수를 그 값을 돌려주는 함수로 바꾸는 리팩터링. 긴 함수를 쪼개기 전 단계로 특히 쓸모 있다.

보기 옵션