한글 자판

날개셋 입력기 글쇠 수식 작성 가이드

DS1TPT 2021. 12. 14. 01:27

날개셋 입력기는 기능이 강력한 만큼 제대로 활용하려면 어느 정도 수식을 다룰 줄 알아야 합니다. 자판 설정 파일만 받아서 쓰는 분들이라면 아무 상관 없지만, 나만의 자판을 만들고자 하는 분들이라면 필수적입니다. 이 글에서는 가장 기초가 되는 글쇠 수식 편집 방법에 대해 간략하게 설명합니다. 고급 기능은 빼고 기본적인 것만 다루려 합니다.

날개셋 글쇠 수식은 도움말에 써있듯 C언어의 문법을 따릅니다. 그래서 프로그래밍과 인연이 없는 분들이라면 어려울 수 있는데, 기본적인 수식 작성 방법을 알려드리기에 앞서 연산자와 문법에 대해서 간략히 알려드리겠습니다.

우선, 이 글에서 쓸 낱말들을 먼저 대충 정리하고 시작하겠습니다.

  • 연산자: 어떠한 연산을 할 지?
  • 피연산자: 연산할 것
  • 변수: 계속 변하는 값을 담는 저장소 개념
  • 상수: 변하지 않고 그대로인 수
  • 참: 0이 아닌 값, 연산 결과에서 참은 1
  • 거짓: 0


다음은 날개셋에서 쓰는 변수 가운데 글쇠 수식에 꼭 필요한 것들의 목록입니다.

구분 내용
D 첫소리 값
E 가운뎃소리 값
F 끝소리 값
N Num Lock 점등 여부(설정을 통해 Scroll Lock도 포함할 수 있음)
P Caps Lock 점등 여부(1: 켜짐)
T 조합 오토마타 상태값

※ 입력된 낱자가 없으면 값은 0(거짓)입니다.

다음은 쓸 일이 있어보이는 연산자들의 목록입니다. 굉장히 자주 쓰이는 연산자는 따로 굵은 글씨로 나타냈습니다.

구분 연산자
대입 연산자 =
관계 연산자 <, >, <=, >=, ==, !=
논리 연산자 &&, ||, !
삼항 연산자 ?
비트 연산자 &, |, ~, ^


대입 연산자는 말 그대로 한 변수에 어느 값을 대입해서 저장하는 연산자입니다. a = 12는 변수 a에 12를 대입한다는 뜻이 됩니다.
관계 연산자는 크고 작음, 같거나 다름을 계산토록 하는 연산자입니다. <=과 >=는 같거나 작음/큼을 나타내고, ==는 같음, !=는 다름을 나타냅니다.
논리 연산자에서 &&, ||, !는 각각 AND(논리곱), OR(논리합), NOT(반전)입니다. 영문 뜻을 그대로 옮기면 각각 그리고, 또는, 아님(반전)입니다.

  • AND는 명제가 모두 참일 때만 결과값이 참이 되며, 하나라도 거짓이면 결과값은 거짓이 됩니다.
  • OR는 명제 중 하나라도 참이라면 결과값이 참이 되며, 모두 거짓이어야 결과값이 거짓이 됩니다.
  • NOT은 참/거짓을 [반전]합니다. 참은 거짓으로, 거짓은 참(1)으로 바꿉니다.

비트 연산자는 비트 단위로 논리 연산을 수행합니다. &, |, ~, ^는 각각 비트단위 AND, 비트단위 OR, 비트단위 NOT, 비트단위 XOR(배타적 논리합)입니다. 여기서 XOR은 OR과 비슷하지만 조금 다릅니다. XOR은 명제가 단 하나만 참일 때 결과값이 참이며, 명제가 모두 참이거나 거짓이면 결과값은 거짓이 됩니다. 이건 쓸 일이 있을지는 모르겠지만 혹시 모르니 적어놓습니다.
삼항 연산자는 명제가 참일 때와 거짓일 때 어떤 동작을 수행할지를 적을 수 있게 합니다. [명제] ? [참일 때] : [거짓일 때] 와 같이 씁니다. 아주 많이 쓰이는 연산자이므로 꼭 기억하시기 바랍니다.

연산자의 순서는 다음과 같습니다.

  1. (, ) → 수학의 괄호와 같음
  2. !, ~
  3. <, >, <=, >=
  4. ==, !=
  5. &
  6. ^
  7. |
  8. &&
  9. ||
  10. ?
  11. =
  12. , (콤마 연산자)


연산자에 대해 알아보았으니, 날개셋에서 자주 보는 16진수에 대해서 설명드리겠습니다. 10진수는 먼저 우리가 흔히 숫자를 표기할 때 쓰는 방식입니다. 16진수는 이와는 다르게 0부터 F(10진수로 15)까지를 한 자리로 합니다. 16진수는 앞에 "0x"라는 접두사를 붙여서 표기합니다.

자리 4 3 2 1
숫자 ×4096(16³) ×256(16²) ×16(16¹) ×1(16⁰)


위의 표를 보시고 16진수를 바로 10진수로 바꿔보실 수 있습니다. 0x0F면 10진수로 15가 되고, 0x10이면 16이 됩니다. 0x20이면 16×2=32가 되죠. 0x200이면 16²×2=256×2=512 이므로 512가 됩니다.
왜 이런 불편한 16진수를 쓸까요?16진수는 2진수로 바로 변환하기에 아주 좋고 값을 줄여서 쓰기에 좋아서 프로그래밍에 널리 쓰입니다. 0x0은 2진수로 0000이고, 0xF는 2진수로 1111이 되기 때문입니다. 2진수는 넷째 자리부터 첫째 자리까지 8 4 2 1이 되니, 1111은 8+4+2+1=15가 되는 식입니다. 그럼 16진수로 0x10은 2진수로 0001 0000이 됩니다. 보시다시피 16진수 한 자리는 2진수 4 자리와 정확하게 맞아 떨어집니다. 논리 회로 따위의 전자 회로가 전기 신호 High(1)와 Low(0)으로만 동작(곧, 2진수로 동작)하기 때문에 16진수로 적으면 2진수로 0001 0100 1000 1111과 같이 쭉 늘어놓을 걸 148F와 같이 줄여서 나타낼 수 있습니다.
비트 단위 연산은 곧 2진수 숫자 한 자리마다 논리 연산을 한다는 뜻입니다. 따라서 0x1 & 0x4는 0001 & 0100이 되므로 0000(0)이 결과값이 되고 0xA | 0x1은 1010 | 0001이 되므로 1011(11, 0xB)이 결과값이 됩니다. 이를 활용하면 N 변수는 스크롤락이 켜지면 1, 넘락이 켜지면 2를, 둘 다 켜지면 3, 모두 꺼지면 0 값을 가지므로, 스크롤락의 여부만 따지기 위해 아래와 같은 수식을 써서 스크롤락이 켜졌는지를 확인할 수 있습니다.

N&2 ? ~~~

N이 스크롤락만 켜진 2(0010)이거나 넘락도 같이 켜진 3(0011)이라면, 2는 0010이므로, 각각 0010 & 0010 == 0010 == 참, 0011 & 0010 == 0010 == 참 입니다. 한편 스크롤 락이 꺼진 두 가지 경우는 각각 0000과 0001인데, 0001 & 0010은 0000이므로 거짓, 0000 & 0010은 0000이므로 거짓이 됩니다. 따라서 스크롤 락의 조작 상태를 확인할 수 있습니다. 이런 경우에 비트 단위 연산을 쓰며, 비트 단위 연산을 이해하기 위해서는 반드시 이진수를 이해하셔야만 합니다.

그럼 실제로 쓰이는 수식들을 우리말로 바꾸어보겠습니다.
• D&&!E&&!F ? [1]: [2]
→ D가 참 그리고 E가 거짓 그리고 F가 거짓인가? 그렇다면 [1], 아니라면 [2]
• !T || E ? [1] : [2]
→ T가 거짓 또는 E가 참인가? 그렇다면 [1], 아니라면 [2]
• T==1 || (E==500 || E==501) ? [1] : [2]
→ T가 1 또는 (E가 상수 500과 같거나 상수 501과 같음)인가? 그렇다면 [1], 아니라면 [2]
→ 16진수로 바꿔 적으면 T==1 || (E==0x1F4 || E==0x1F5) ? [1] : [2]이 됩니다.
• P ? [3] : D&&E&&E<0x1F4 ? [1] : [2]
→ P가 참인가? 그렇다면 [3], 아니라면 다음 수식을 실행 → D가 참이고 E가 참이며 E의 값은 상수 0x1F4(500) 미만인가? 그렇다면 [1], 아니라면 [2]
※ 수식의 [1]과 [2]에서 다른 수식이 없고 문자 값만 있다면 그 문자가 입력됩니다.

위의 4개 수식에서 볼 수 있듯 사람이 말하는 것과 아주 비슷하게 적힙니다. 그 표현 방법이 사람보단 컴퓨터가 알아듣기 좋은 모습일 뿐입니다. 위 수식들은 바꾼 꼴 신세벌식 자판과 이건구 한 손 세벌식에서 쓰인 수식들을 그대로 가져온 것입니다. 어떤 식으로 작성되는지를 한 눈에 아실 수 있습니다.

날개셋 수식에서 한글은 H2|~~이나 H3|~~와 같이 나타냅니다. H2는 두벌식 자모, H3는 세벌식 자모를 나타냅니다. 0x~~~~와 같이 적힌 수식은 유니코드 문자 값을 나타냅니다.

  • 첫소리일 때는 한 글자만 들어가면 H3|G_(ㄱ)와 같이 뒤에 _을 붙이고, 두 글자라면 H3|GG(ㄲ)와 같이 _을 적지 않습니다.
  • 홀소리일 때는 한 글자만 들어가면 H3|I_(ㅣ)와 같이 뒤에 _을 붙이고, 두 글자라면 H3|YE(ㅖ)와 같이 _을 적지 않습니다.
  • 끝소리일 때는 글자의 길이와 관계 없이 H3|_SS(ᆻ) | 뒤에 _을 무조건 적습니다.


여기까지 따라오셨다면 다른 응용도 충분히 하실 수 있습니다. 변수에 날개셋에서 한글을 조합할 때 쓰는 변수 말고도 다른 변수를 지정한 다음 그 변수를 글쇠 수식에서 읽어들일 수 있게 하면 엄청나게 많은 일들을 할 수 있습니다. 가령, 팥알님의 D&&E&&E<0x1F4&&c<2 (3-2014 자판에 들어감)수식은 c값을 통해 겹받침이 들어갔는가를 알아차리게 하는데, 이런 식으로 변수를 지정해서 글쇠 수식에서 여러 값을 읽어들이고 그에 따라 다른 동작을 하도록 하실 수 있습니다.

수고 많으셨습니다. 여기까지 익히셨다면 기본적인 날개셋 글쇠 수식 작성을 하실 수 있을 것입니다.