최근 수정 시각 : 2025-08-25 19:50:12

매직넘버


파일:한시적 넘겨주기 아이콘.svg  
#!if 리스트 == null
{{{#!html 2025 KBO 리그의 매직넘버}}}에 대한 내용은 [[2025 신한 SOL Bank KBO 리그/일자별 매직넘버]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[2025 신한 SOL Bank KBO 리그/일자별 매직넘버#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[2025 신한 SOL Bank KBO 리그/일자별 매직넘버#|]] 부분을}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 리스트 != null
한시적 넘겨주기로 연결되는 다른 문서에 대한 내용은 아래 문서를
참고하십시오.
#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
2025 KBO 리그의 매직넘버: }}}[[2025 신한 SOL Bank KBO 리그/일자별 매직넘버]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[2025 신한 SOL Bank KBO 리그/일자별 매직넘버#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[2025 신한 SOL Bank KBO 리그/일자별 매직넘버#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

1. 스포츠 용어2. 선거 용어3. 물리학 용어
3.1. 관련 문서
4. 컴퓨터 프로그래밍 용어
4.1. 설명 없이 무작정 등장하는 상수4.2. 자료 구조를 식별하기 위해 특정 값으로 맞춰지는 필드4.3. 파일 형식을 식별하기 위해 파일 맨 앞에 붙이는 특정 값
5. VOCALOID 오리지널 곡

Magic Number

1. 스포츠 용어

파일:상세 내용 아이콘.svg   자세한 내용은 매직넘버(스포츠) 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[매직넘버(스포츠)#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[매직넘버(스포츠)#|]] 부분을
참고하십시오.

2. 선거 용어

파일:상세 내용 아이콘.svg   자세한 내용은 매직넘버(선거) 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[매직넘버(선거)#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[매직넘버(선거)#|]] 부분을
참고하십시오.

3. 물리학 용어

원자핵에서 양성자나 중성자의 수가 일정한 숫자가 되면 다른 원자핵에 비해서 안정해진다. 이를 매직넘버라고 한다. 현재 알려진 매직넘버는 2, 8, 20, 28, 50, 82, 126, 184 등이고 핵자껍질[1] 모델로 부분적으로 이해된다. 만약 원자핵의 양성자와 중성자 개수가 둘 다 매직넘버일 경우 doubly magic number라고 하며 더욱 안정해진다. 즉, 엇비슷한 핵자 수를 가진 주변 원소에서는 방사성 붕괴를 하지만 이 핵은 안정한 핵이 되거나, 주변 원소보다 훨씬 더 긴 반감기를 가지게 된다.

양성자의 수만 보면 헬륨(2), 산소(8), 칼슘(20), 니켈(28), 주석(50), (82)이 있다. 아직 발견되거나 만들어지지 않은 원소 가운데에는 운비헥슘(126)이 매직넘버에 드는 양성자 수를 가지고 있는데, 양성자의 개수로는 126을 만족시키고 중성자의 개수로는 또 하나의 매직넘버인 184를 만족시키는 새로운 원소를 만들 수 있다면 그 녀석은 고작 몇마이크로초 버티고 붕괴하는 것이 전부인 다른 초우라늄 원소와는 달리 제법 안정한 모습을 띄지 않을까 과학자들은 기대하고 있는 중. 이런 안정성의 섬에 드는 원소를 찾기 위해 과학자들은 끊임없이 노력하고 있다.

마법수라고도 번역한다.

n번째 마법수를 구하는 방법은 1≤n≤3 일 때는 aₙ=n(n+1)(n+2)/3 이고, 4≤n≤7 일 때는 aₙ=n(n²+5)/3 이다.

3.1. 관련 문서

4. 컴퓨터 프로그래밍 용어

4.1. 설명 없이 무작정 등장하는 상수

프로그램 구동 과정에서 필요한데 선언이나 설명 없이 등장하는 상수를 말한다.

예를 들어서 학생의 학적 상태를 "1이면 재학, 2이면 휴학, 3이면 제적, 4이면 졸업"으로 나타낸다고 가정하자. 이 경우, "이 학생이 졸업했는가"를 따지기 위해 "학생.상태 == 1" 따위로 나타낼 경우에 쓰이는 숫자가 좋은 예시다.

얼핏 보면 매직 넘버를 사용하는 것이 코드가 짧아져서 편해 보일 거라고 생각할 수 있겠지만, 스파게티 코드화시키는 요인 중 하나로, 유지보수에는 헬게이트가 열린다. 예시에서 "재학"을 나타내는 번호가 1에서 5로 바뀐다면, 그 매직넘버를 일일이 찾아 가면서 1이라는 숫자가 어떤 의미로 쓰인 1인지 찾아내고 대상만 정확히 고쳐야 한다. 어느 한 군데를 빼먹거나, 반대로 다른 의미로 쓰이는 1과 헷갈리는 경우의 참상은 더 이상 말할 필요가 없다. 그나마 주석이라도 달았으면 조금은 편해지겠지만, 그 주석마저 없거나, 한 술 더 떠 필드 이름이 전혀 직관적이지 않을 경우에는..

괜히 프로그래밍 언어들에서 "상수"나 "열거형"의 개념이 주어지는 것이 아니다. 쓰기 편한 것(writability)과 읽기 편한 것(readability) 사이에는 등가교환이 존재하기 때문에, 어느 한쪽을 취하려면 다른 한쪽을 포기해야 하는 경우가 왕왕 있다. 하지만 대부분의 코딩은 혼자 하는 것이 아니고, 프로젝트가 커지고 개발 시간이 길어질수록 코드의 무게도 계속해서 증가하기 때문에 적당한 선에서 자신과 동료들 모두가 읽기 편한 표기를 기준으로 작성하는 것이 좋다.

비슷한 맥락에서 프로그램을 구동시키는 데에 핵심적인 부분이지만 직관적으로 이해하기 매우 어려운 상수를 매직 넘버라고 하는 경우도 있다. 가령 FizzBuzz 문제에서의 19142723이 그런데, 이 수를 2진수로 풀어보면 00 00 01 00 10 01 00 00 01 10 00 01 00 00 11로 1에서 15까지 Fizz와 Buzz가 나타나는 패턴이 두 자리 단위로 코딩된 것을 알 수 있다. 가장 유명한 매직 넘버는 조명의 입사각과 반사각을 구하는 데에 필요한 계산식 1/sqrt(x)의 값을 구하는 데에 사용된 0x5f3759df이다.

4.2. 자료 구조를 식별하기 위해 특정 값으로 맞춰지는 필드

특히 포인터 개념과 맞물려서 형 검사라는 개념이 안드로메다로 가버린 C언어에서 보통 사용되는 테크닉이다.

특정한 자료 구조를 조작하는 함수에서, 어떤 자료 구조의 포인터가 들어왔을 때, 그 포인터가 담고 있는 내용이 진짜로 그 구조로 되어 있는지는 아무도 모른다. 그 주소에 들어있는 것이 다른 자료구조일 수도 있고, 심한 경우에는 아예 포인터가 가리키고 있는 주소가 지금은 유효하지 않은 주소일 가능성도 있다. 결국 포인터만 가지고 여기에 진짜 의도한 내용이 들어 있었는지 알 도리가 없기 때문에, 아예 자료구조에 잉여 필드를 하나 만들어서 그 필드를 특정한 비트 패턴(혹은 특정한 상수)으로 채워버려서, 그 필드에 의도한 값이 들어있는지만 검사하면 쉽게 형 검사 비슷한 것을 할 수 있다. 이 때 쓰이는 필드와 그 값을 "매직 넘버"라고 한다.

물론 객체 지향 프로그래밍의 개념이 완전히 정립된 뒤 나온 언어들의 경우, 형 변환 한 번 이뤄질 때마다 런타임에서 이런 과정을 전부 거치기 때문에 이런 삽질을 굳이 할 필요가 없다.

4.3. 파일 형식을 식별하기 위해 파일 맨 앞에 붙이는 특정 값

위 4.2번 항목과 비슷한 예로, 파일 첫머리에 이 파일이 어떤 형식인지를 기재해 확장자가 바뀌어도 올바르게 인식할 수 있도록 하는 기능을 한다. JPG 파일의 확장자가 BMP나 PNG 같은 걸로 바뀌어도 이미지 뷰어가 제대로 읽어낼 수 있는 건 이 매직넘버를 읽고 JPG 형식임을 알아냈기 때문이다.

하지만 이러한 점 때문에 도리어 랜섬웨어의 표적이 되기도 한다. 확장자만 인식하는 구형 랜섬웨어에는 해당하지 않지만, 신형 랜섬웨어는 매직넘버를 읽어들이는 기능도 내장하고 있기 때문. 인터넷에 퍼져 있던 랜섬웨어 예방법을 그대로 믿다 신형 랜섬웨어에 탈탈 털렸다는 후기가 나온 것도 이 때문이다.
파일:상세 내용 아이콘.svg   자세한 내용은 파일 시그니처 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[파일 시그니처#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[파일 시그니처#|]] 부분을
참고하십시오.

5. VOCALOID 오리지널 곡

파일:상세 내용 아이콘.svg   자세한 내용은 magic number 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[magic number#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[magic number#|]] 부분을
참고하십시오.
[1] 전자껍질 모델과 엇비슷하지만 다른 원자핵의 모형이다.