매직넘버

 

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


1. 스포츠 용어




2. 선거 용어




3. 화학 용어


원자핵에서 양성자나 중성자의 수가 일정한 숫자가 되면 다른 원자핵에 비해서 안정해진다. 이를 매직넘버라고 한다. 현재 알려진 매직넘버는 2, 8, 20, 28, 50, 82, 126, 184 등이고 핵자껍질[1] 모델로 부분적으로 이해된다. 만약 원자핵의 양성자와 중성자 개수가 둘 다 매직넘버일 경우 doubly magic number라고 하며 더욱 안정해진다. 즉, 엇비슷한 핵자 수를 가진 주변 원소에서는 방사성 붕괴를 하지만 이 핵은 안정한 핵이 되거나, 주변 원소보다 훨씬 더 긴 반감기를 가지게 된다.
양성자의 수만 보면 헬륨(2), 산소(8), 칼슘(20), 니켈(28), 주석(50), (82)이 있다. 아직 발견되거나 만들어지지 않은 원소 가운데에는 운비헥슘(126)이 매직넘버에 드는 양성자 수를 가지고 있는데, 양성자의 개수로는 126을 만족시키고 중성자의 개수로는 또 하나의 매직넘버인 184를 만족시키는 새로운 원소를 만들 수 있다면 그 녀석은 고작 몇마이크로초 버티고 붕괴하는 것이 전부인 다른 초우라늄 원소와는 달리 제법 안정한 모습을 띄지 않을까 과학자들은 기대하고 있는 중. 이런 안정성의 섬에 드는 원소를 찾기 위해 과학자들은 끊임없이 노력하고 있다.
마법수라고도 번역한다.
마법수를 구하는 방법은 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" 따위로 나타낼 경우, 이런 식으로 설명 없이 등장하는 상수를 바로 "매직 넘버"라고 한다.
얼핏 보면 매직 넘버를 사용하는 것이 코드가 짧아져서 편해 보일 거라고 생각할 수 있겠지만, 이 역시 코드를 스파게티화시키는 요인 중 하나로 이런 짓을 하게 되면 유지보수에는 헬게이트가 제대로 열린다. 당장 예를 들어 "재학"을 나타내는 번호가 5로 바뀐다고 가정하면, 위와 같은 조건문이 수십 군데에서 등장할 경우 그 수십 군데를 일일이 찾아 가면서 1이라는 숫자가 어떤 의미로 쓰인 1인지 찾아내고 맞는 것만 정확히 고쳐야 한다. 어느 한 군데를 빼먹거나, 반대로 다른 의미로 쓰이는 1과 헷갈리는 경우의 참상은 더 이상 말할 필요가 없다. 그나마 주석이라도 달았으면 조금은 편해지겠지만, 그 주석마저 없거나, 한 술 더 떠 필드 이름이 전혀 직관적이지 않을 경우에는..
괜히 프로그래밍 언어들에서 "상수"나 "열거형"의 개념이 주어지는 것이 아니다. 쓰기 편한 것(writability)과 읽기 편한 것(readability)은 서로 약간의 트레이드 오프 관계이기 때문에, 한쪽이 좋아지면 다른 쪽이 안 좋아지는 경우가 왕왕있다. 하지만 대부분의 코딩은 혼자하는 것이 아니고, 시간이 지날 수록 양이 많아지는 것이기 때문에, 적당한 선에서 읽기 편한 쪽으로 스텐스를 잡고 작성하는 것이 좋다. 착한 위키러라면 과제를 할 때도 코드 상단에 상수로 지정하거나, 열거형으로 선언하는 습관을 들일 수 있도록 하자.

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


특히 포인터 개념과 맞물려서 형 검사라는 개념이 안드로메다로 가버린 C 언어에서 보통 사용되는 테크닉이다.
특정한 자료 구조를 조작하는 함수에서, 어떤 자료 구조의 포인터가 들어왔을 때, 그 포인터가 담고 있는 내용이 진짜로 그 구조로 되어 있는지는 아무도 모른다. 그 주소에 들어있는 것이 다른 자료구조일 수도 있고, 심한 경우에는 아예 포인터가 가리키고 있는 주소가 지금은 유효하지 않은 주소일 가능성도 있다. 결국 포인터만 가지고 여기에 진짜 의도한 내용이 들어 있었는지 알 도리가 없기 때문에, 아예 자료구조에 잉여 필드를 하나 만들어서 그 필드를 특정한 비트 패턴(혹은 특정한 상수)으로 채워버려서, 그 필드에 의도한 값이 들어있는지만 검사하면 쉽게 형 검사 비슷한 것을 할 수 있다. 이 때 쓰이는 필드와 그 값을 "매직 넘버"라고 한다.
물론 객체 지향 프로그래밍의 개념이 완전히 정립된 뒤 나온 언어들의 경우, 형 변환 한 번 이뤄질 때마다 런타임에서 이런 과정을 전부 거치기 때문에 이런 삽질을 굳이 할 필요가 없다.

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


위 4.2번 항목과 비슷한 예로, 파일 첫머리에 이 파일이 어떤 형식인지를 기재해 확장자가 바뀌어도 올바르게 인식할 수 있도록 하는 기능을 한다. JPG 파일의 확장자가 BMP나 PNG 같은 걸로 바뀌어도 이미지 뷰어가 제대로 읽어낼 수 있는 건 이 매직넘버를 읽고 JPG 형식임을 알아냈기 때문이다.
하지만 이러한 점 때문에 도리어 랜섬웨어의 표적이 되기도 한다. 확장자만 인식하는 구형 랜섬웨어에는 해당하지 않지만, 신형 랜섬웨어는 매직넘버를 읽어들이는 기능도 내장하고 있기 때문. 인터넷에 퍼져 있던 랜섬웨어 예방법을 그대로 믿다 신형 랜섬웨어에 탈탈 털렸다는 후기가 나온 것도 이 때문이다.

[1] 전자껍질 모델과 엇비슷하지만 다른 원자핵의 모형이다.