|
다음은 날개셋에서 쓰는 변수 가운데 글쇠 수식에 꼭 필요한 것들의 목록입니다.
구분 | 내용 |
D | 첫소리 값 |
E | 가운뎃소리 값 |
F | 끝소리 값 |
N | Num Lock 점등 여부(설정을 통해 Scroll Lock도 포함할 수 있음) |
P | Caps Lock 점등 여부(1: 켜짐) |
T | 조합 오토마타 상태값 |
※ 입력된 낱자가 없으면 값은 0(거짓)입니다.
다음은 쓸 일이 있어보이는 연산자들의 목록입니다. 굉장히 자주 쓰이는 연산자는 따로 굵은 글씨로 나타냈습니다.
구분 | 연산자 |
대입 연산자 | = |
관계 연산자 | <, >, <=, >=, ==, != |
논리 연산자 | &&, ||, ! |
삼항 연산자 | ? |
비트 연산자 | &, |, ~, ^ |
대입 연산자는 말 그대로 한 변수에 어느 값을 대입해서 저장하는 연산자입니다. a = 12는 변수 a에 12를 대입한다는 뜻이 됩니다.
관계 연산자는 크고 작음, 같거나 다름을 계산토록 하는 연산자입니다. <=과 >=는 같거나 작음/큼을 나타내고, ==는 같음, !=는 다름을 나타냅니다.
논리 연산자에서 &&, ||, !는 각각 AND(논리곱), OR(논리합), NOT(반전)입니다. 영문 뜻을 그대로 옮기면 각각 그리고, 또는, 아님(반전)입니다.
비트 연산자는 비트 단위로 논리 연산을 수행합니다. &, |, ~, ^는 각각 비트단위 AND, 비트단위 OR, 비트단위 NOT, 비트단위 XOR(배타적 논리합)입니다. 여기서 XOR은 OR과 비슷하지만 조금 다릅니다. XOR은 명제가 단 하나만 참일 때 결과값이 참이며, 명제가 모두 참이거나 거짓이면 결과값은 거짓이 됩니다. 이건 쓸 일이 있을지는 모르겠지만 혹시 모르니 적어놓습니다.
삼항 연산자는 명제가 참일 때와 거짓일 때 어떤 동작을 수행할지를 적을 수 있게 합니다. [명제] ? [참일 때] : [거짓일 때] 와 같이 씁니다. 아주 많이 쓰이는 연산자이므로 꼭 기억하시기 바랍니다.
연산자의 순서는 다음과 같습니다.
연산자에 대해 알아보았으니, 날개셋에서 자주 보는 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~~~~와 같이 적힌 수식은 유니코드 문자 값을 나타냅니다.
여기까지 따라오셨다면 다른 응용도 충분히 하실 수 있습니다. 변수에 날개셋에서 한글을 조합할 때 쓰는 변수 말고도 다른 변수를 지정한 다음 그 변수를 글쇠 수식에서 읽어들일 수 있게 하면 엄청나게 많은 일들을 할 수 있습니다. 가령, 팥알님의 D&&E&&E<0x1F4&&c<2 (3-2014 자판에 들어감)수식은 c값을 통해 겹받침이 들어갔는가를 알아차리게 하는데, 이런 식으로 변수를 지정해서 글쇠 수식에서 여러 값을 읽어들이고 그에 따라 다른 동작을 하도록 하실 수 있습니다.
수고 많으셨습니다. 여기까지 익히셨다면 기본적인 날개셋 글쇠 수식 작성을 하실 수 있을 것입니다.
첫댓글 친절한 날개셋 수식 설명 정말 감사합니다! 제 ist파일의 수식의 경우 H3| 대신 H21|으로 세벌식 자모 값이 입력되어있는데 이 둘이 같은 것인지 질문드립니다.
H21은 중종/초 다중한글을 나타낼 때 씁니다. 둘은 다릅니다. 세벌식으로 낱자를 넣으면 일반적으로 첫→가→끝 순서로 넣는데, 다중 한글은 낱자를 가→끝/첫 이나 끝/첫→가 순으로 적용시킵니다. 그래서 한 타 만으로 '이'→'임ㄱ'(받침 ㅁ+ㄱ), 'ㅇ'→'이ㅁ'(ㅣ+ㅁ) 같은 상태를 만들 수 있습니다. 동일한 글자의 여러 낱자를 현재의 글자에다 한데 조합할 뿐만 아니라 다음 글자의 낱자에도 영향을 줄 수 있습니다. 이런 특별한 경우가 아니면 H3로 쓰시면 됩니다.
16진수나 2진수 변환은 의외로 윈도우 계산기에서 편하게 보실 수 있습니다~
계산기 메뉴에서 프로그래머용으로 전환하면 16진수, 10진수, 8진수, 2진수로 동시에 볼 수 있답니다
부연설명 고맙습니다. 윈도우 계산기에 프로그래머 계산기가 있는 걸 잊고 있었습니다 ^^;;
좋은 강의 감사합니다. 비트연산 부분은 날개셋 도움말을 읽어도 이해를 못했는데 이제 좀 알 것도 같네요. 그럼 N&D면 첫소리값을 무시하고 1011과 AND연산을 하는 건가요? 어렵네요..
N&D면 N(num lock 및 scroll lock 상태값)과 D(첫소리 값)을 비트 단위로 AND연산을 하는 계산식이네요.
첫소리가 있다고 하면 0이 아닌 값이 D에 들어가고, 첫소리가 없으면 0000이 되겠죠.
날개셋 제어판에 들어가셔서 낱자 처리 부분에 들어가시면 초성 부분에 입력(I) 부분에서 첫소리를 선택하면 그 값이 보입니다.
그러면 예를 들어 넘락과 캡스락이 같이 켜져 있다면 N의 값은 0011(2) == 3(10), 첫소리 ㅅ이 들어갔다면 D == 109(10) == 0110 1101(2)인데, 0110 1101(D에 들어간 값)과 0000 0011(N의 값)을 bitwise(비트 단위)-AND 연산하게 되니 0000 0001(2) = 1(10) 이 됩니다. ㄲ이 첫소리로 들어갔다면 0000 0010(2) == 2(10)이니, 이때 N&D의 값은 0000 0010(2) == 2(10)이 됩니다. 만약 D의 값이 4라면 이때는 결과값은 0이 되겠죠.
※ 괄호친 부분은 이진수인지 십진수인지를 나타냅니다
그림을 참고하시면 이해하기 더 쉬울 것 같습니다.
@DS1TPT 친절한 설명 감사드립니다. 본문 N&2의 2를 16진수로 생각하고 그럼 D가 첫소리값인지 십진수 13인지 헷갈렸는데 제가 오해했네요. 첫소리값이 들어가게 되는 거군요.