모스 부호는 점(·)과 선(—)만으로 모든 문자를 표현하는 부호 체계입니다. 아마추어 무선부터 스마트폰 접근성 기능까지 지금도 활발히 사용됩니다. 이 가이드에서는 모스 부호의 기초와 양방향 변환 원리를 설명합니다.

텍스트를 모스 부호로 변환하기 →

모스 부호란?

1830년대 새뮤얼 모스와 앨프리드 베일이 전신기와 함께 개발한 부호 시스템입니다. 짧은 신호(점)와 긴 신호(선)의 조합으로 문자를 표현합니다.

  • 점(·): 1단위 짧은 신호
  • 선(—): 3단위 긴 신호
  • 문자 내 기호 간격: 1단위
  • 문자 간 간격: 3단위
  • 단어 간 간격: 7단위

이 1:3:7 시간 비율이 지켜지면 숙련된 운용자는 분당 25단어 이상의 속도로 송수신할 수 있습니다.

모스 부호표

알파벳

문자부호문자부호문자부호
A·—J·———S···
B—···K—·—T
C—·—·L·—··U··—
D—··M——V···—
E·N—·W·——
F··—·O———X—··—
G——·P·——·Y—·——
H····Q——·—Z——··
I··R·—·

숫자

숫자부호숫자부호
0—————5·····
1·————6—····
2··———7——···
3···——8———··
4····—9————·

자주 쓰는 기호

기호부호
.(마침표)·—·—·—
,(쉼표)——··——
?(물음표)··——··
/(슬래시)—··—·

프로사인

프로사인(절차 부호)은 문자 간 간격 없이 연속으로 전송하는 2자 조합입니다. 아마추어 무선 교신에서 자주 사용됩니다:

프로사인의미
AR메시지 종료
AS대기 (스탠바이)
BT단락 구분 (= 해당)
CQ전체 국 호출
DE송신자 식별 (~로부터)
K응답 요청
SK교신 종료
SOS조난 신호 (···———···)

SOS가 유명한 이유는 어느 방향에서 봐도 대칭인 패턴이라 혼란스러운 상황에서도 인식하기 쉽기 때문입니다.

양방향 변환 원리

텍스트 → 모스 부호: 각 문자를 부호표에서 찾아 치환합니다. 단어 구분은 /로 표시합니다. 동일한 문자는 항상 동일한 부호로 변환됩니다.

모스 부호 → 텍스트: /와 공백으로 분리해 역방향으로 조회합니다. 올바른 간격으로 전송된 모스 부호는 유일하게 디코딩됩니다.

JavaScript 구현

const MORSE_MAP = {
  'A': '.-',   'B': '-...',  'C': '-.-.',
  'D': '-..',  'E': '.',     'F': '..-.',
  'G': '--.',  'H': '....',  'I': '..',
  'J': '.---', 'K': '-.-',   'L': '.-..',
  'M': '--',   'N': '-.',    'O': '---',
  'P': '.--.',  'Q': '--.-', 'R': '.-.',
  'S': '...',  'T': '-',     'U': '..-',
  'V': '...-', 'W': '.--',   'X': '-..-',
  'Y': '-.--', 'Z': '--..',
  '0': '-----', '1': '.----', '2': '..---',
  '3': '...--', '4': '....-', '5': '.....',
  '6': '-....', '7': '--...', '8': '---..',
  '9': '----.'
};

const REVERSE_MAP = Object.fromEntries(
  Object.entries(MORSE_MAP).map(([k, v]) => [v, k])
);

function textToMorse(text) {
  return text.toUpperCase().split('').map(char => {
    if (char === ' ') return '/';
    return MORSE_MAP[char] ?? '?';
  }).join(' ');
}

function morseToText(morse) {
  return morse.split(' / ').map(word =>
    word.split(' ').map(code => REVERSE_MAP[code] ?? '?').join('')
  ).join(' ');
}

// 예시
textToMorse('SOS');         // '... --- ...'
morseToText('... --- ...'); // 'SOS'

Python 구현

MORSE_MAP = {
    'A': '.-',   'B': '-...', 'C': '-.-.',
    'D': '-..',  'E': '.',    'F': '..-.',
    'G': '--.',  'H': '....', 'I': '..',
    'J': '.---', 'K': '-.-',  'L': '.-..',
    'M': '--',   'N': '-.',   'O': '---',
    'P': '.--.',  'Q': '--.-', 'R': '.-.',
    'S': '...',  'T': '-',    'U': '..-',
    'V': '...-', 'W': '.--',  'X': '-..-',
    'Y': '-.--', 'Z': '--..',
    '0': '-----', '1': '.----', '2': '..---',
    '3': '...--', '4': '....-', '5': '.....',
    '6': '-....', '7': '--...', '8': '---..',
    '9': '----.',
}

REVERSE_MAP = {v: k for k, v in MORSE_MAP.items()}

def text_to_morse(text: str) -> str:
    return ' '.join(
        '/' if c == ' ' else MORSE_MAP.get(c.upper(), '?')
        for c in text
    )

def morse_to_text(morse: str) -> str:
    words = morse.strip().split(' / ')
    return ' '.join(
        ''.join(REVERSE_MAP.get(code, '?') for code in word.split())
        for word in words
    )

print(text_to_morse('SOS'))          # ... --- ...
print(morse_to_text('... --- ...'))  # SOS

실용적인 활용 사례

아마추어 무선 (햄 라디오): 모스 부호(CW 모드)는 여전히 현역 통신 수단입니다. 음성보다 대역폭이 좁아 잡음이 많은 환경에서도 전달되며, 한국아마추어무선연맹(KARL) 시험에서 관련 지식이 요구됩니다.

접근성: iOS와 Android 모두 모스 부호 입력을 지원합니다. 스위치 접근성 등 단일 입력 수단만 사용할 수 있는 사용자도 점과 선의 조합으로 모든 문자를 입력할 수 있습니다.

임베디드 학습 프로젝트: LED나 피에조 버저로 모스 부호를 출력하는 것은 Arduino·라즈베리파이 피코의 ‘Hello, World’로 유명합니다. 타이밍 제어 연습에도 효과적입니다.

CTF 챌린지: 보안 대회에서 음성 파형이나 이미지 메타데이터에 모스 부호를 숨긴 문제가 자주 출제됩니다.

온라인으로 변환하기

ZeroTool 모스 부호 변환기는 텍스트 ↔ 모스 부호 실시간 양방향 변환을 지원합니다. ITU 표준 알파벳·숫자·일반 기호를 모두 지원하며, 가입 없이 브라우저에서 바로 사용할 수 있습니다.

모스 부호 변환기 사용하기 →