(C#.NET 한글 프로그램 제작) 한글 조립 및 분해 하기 (유니코드 Unicode)

 

이글은 한글을 조립하거나 분해하는 방법을 다룹니다.

프로그램도 첨부했습니다.

가능한한 가독성이 좋도록 설계했습니다.

 

(아래 그림은 본 글에서 제작한 프로그램을 실행한 화면을 갈무리 한 것 입니다.)

 

 

오늘은 유니코드 한글 조립 및 분해 테스트를 해봤다.

 

유니코드 페이지 사이트 입니다.

 https://unicode-table.com/en/blocks/hangul-syllables/

 

위 사이트에서 유니코드 표를 보다보니,

일상 생활에서 거의 사용하지 않는 글자 수가 엄청나게 많다는 걸 알 수 있었다.

호기심에 그런 글자들을 대략 수 백 여개 읽어봤다.

지금까지 들어보지 못한 별의 별 발음이 내 입에서 마구 튀어나왔다.

생전 처음 발음해보는 글자들인데도 보는 순간 바로 발음이 됐다.

새삼 신기하고 정말 놀라웠다 !!

 

놀랍도록 정교하고 창조적인 한글 속에는 우리가 생각지도 못한 많은

응용 가능성이 있을 텐데, 이를 알아보고 활용하는 사람들이 과연 얼마나 될까?

대부분은 그저 전달할 글을 작성하는데 외에는 거의 활용할 줄 모른다.

더군다나, 단어를 사용 할 때에도 본래의 의미나 아름다움을 알아 보지 못하고

외래어만을 선호하거나 비속어나 약자들을 많이 사용한다.

(전문 분야는 어쩔 수 없겠지만, 공기관들의 각 종 행정 용어들이나 인터넷이나

 어린 애들이 사용하는 용어들, 그리고 맞춤법 다 무시하는 모습들을 보면

 좀 안타깝다는 생각마저 든다.)

 

말이 잠깐 엉뚱하게 샜었는데,

한글의 활용 방법을 하나 찾아낸 디자이너가 뉴스에 소개된 적이 있었다.

그는 한글을 디자인 소재로 활용한다. 나름 신선했다.

 

그렇다면 또 다른 응용들로도 충분히 넓혀 갈 수 있으리라고 생각한다. ...

예를 들면, 소리를 잘 표현할 수 있는 한글의 특성을 자연의 소리들이나 음악과

접목해서 '한글 사운드 오토마타(automata)'를 제작해 본다거나... 하는 것들 말이다.

 

한글의 입체적 요소를 3D 프린팅 기술과 접목해서 사람들의 표현을

눈에 보이는 입체 모형으로 만들어 활용하는 시도 같은 것도 재밌을 것 같다.

 

-- 한글 조립 및 분해하는 프로그램 제작 한 것 입니다. --

그런데, 쓸데 없이 만든 것 같다. 하지만, 나중에 쓰게 될지도 모르니까요.

(유니코드 표는 파일로 첨부했습니다.) 

 

<Form1.cs>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

 

namespace Test3
{
   public partial class Form1 : Form
   {
      한글문자조립 한;

  public Form1()
      {
         InitializeComponent();
      }


      private void btn조립하기_Click(object sender, EventArgs e)
      {
         textBox3.Text = textBox2.Text = "";

         string input = textBox1.Text;
         string[] 글자목록 = input.Split(new string[] { "\"" }, StringSplitOptions.None);
         string[] 자소목록;
         char ch;
         short srt;
         List<byte> bytes = new List<byte>(); ;

  string output = "";
         int 자소개수, idx초성, idx중성, idx종성;
         
         foreach(string 글자 in 글자목록)
         {
            자소목록 = 글자.Split(new string[] { "," }, StringSplitOptions.None);
            자소개수 = 자소목록.Length;


            switch(자소개수)
            {
               case 2:
                  idx초성 = 한.Get초성인덱스(자소목록[0]);
                  idx중성 = 한.Get중성인덱스(자소목록[1]);
                  idx종성 = 0;
                  output += 한.Get완성된한글(idx초성, idx중성, idx종성);
                  break;
               case 3:
                  idx초성 = 한.Get초성인덱스(자소목록[0]);
                  idx중성 = 한.Get중성인덱스(자소목록[1]);
                  idx종성 = 한.Get종성인덱스(자소목록[2]);
                  output += 한.Get완성된한글(idx초성, idx중성, idx종성);
                  break;
            }
            textBox2.Text += output;

   textBox3.Text += output;
            ch = output[0];
            srt = (short)ch;
            textBox3.Text += " " + srt.ToString("X");
            textBox3.Text += "\r\n";

            output = "";
            bytes.Clear();
         }
      }

 

      private void btn분해하기_Click(object sender, EventArgs e)
      {
         textBox5.Text = "";
         string[] 분해된자소 = 한.Get분해된자소(tb분해할문자열.Text, chk무받침생략.Checked);
         foreach (string s in 분해된자소) textBox5.Text += s + ",";
      }

 

      private void Form1_Load(object sender, EventArgs e)
      {
         한 = new 한글문자조립();
      }
   }

 

   public class 한글문자조립
   {
      // 유니코드표에서의 기본 위치
      const int 한글코드시작점 = 0xAC00;  // 유니코드에서 '가'의 위치
      const int 자음시작점 = 0x1100;
      const int 모음시작점 = 0x1161;

 

      // 자소 목록
      List<string> 초성한글자소;
      List<string> 초성대응영문자;    // 키보드에서 초성 한글 자소에 대응하는 영문자
      List<string> 중성한글자소;
      List<string> 중성대응영문자;
      List<string> 종성한글자소;
      List<string> 종성대응영문자;

 

      // 임시 변수
      int 중종곱;

 

      public 한글문자조립()
      {
         초성한글자소 = (
            new string[] { "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ"
                         , "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" }
            ).ToList<string>();    // 총 19개 요소
         초성대응영문자 = (
            new string[] { "r", "R", "s", "e", "E", "f", "a", "q", "Q", "t", "T", "d"
                         , "w", "W", "c", "z", "x", "v", "g" }
            ).ToList<string>();    // 총 19개 요소

         중성한글자소 = (
            new string[] { "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ"
                         , "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ"
                         , "ㅣ" }
            ).ToList<string>();    // 총 21개 요소
         중성대응영문자 = (
            new string[] { "k", "o", "i", "O", "j", "p", "u", "P", "h", "hk"
                         , "ho", "hl", "y", "n", "nj", "np", "nl", "b", "m", "ml"
                         , "l" }
            ).ToList<string>();    // 총 21개 요소

  종성한글자소 = (
            new string[] { string.Empty, "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ"
                         , "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ"
                         , "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" }
            ).ToList<string>();    // 총 28개 요소
         종성대응영문자 = (
            new string[] { string.Empty, "r", "R", "rt", "s", "sw", "sg", "e", "f", "fr"
                         , "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t"
                         , "T", "d", "w", "c", "z", "x", "v", "g" }
            ).ToList<string>();    // 총 28개 요소

 

         중종곱 = 중성한글자소.Count * 종성한글자소.Count;
      }

 

      public char Get완성된한글(int 초성, int 중성, int 종성)
      // 초성, 중성, 종성을 받아 완성된 글자 하나를 반환
      {
         if (초성 < 0 && 중성 < 0) return ' ';
         if (종성 < 0) 종성 = 0;    // 받침 없는 글자

         int i완성된한글 = (초성 * 중종곱)
                         + (중성 * 종성한글자소.Count)
                         + (종성)
                         + 한글코드시작점;
         byte[] b완성된한글 = BitConverter.GetBytes((short)i완성된한글);
         char c완성된한글 = char.Parse(Encoding.Unicode.GetString(b완성된한글));
         return c완성된한글;
      }

 

      public int Get초성인덱스(string 초성)
      {
         string s = 초성.ToString();
         return 초성한글자소.Contains(s) ? 초성한글자소.IndexOf(s) : 초성대응영문자.IndexOf(s);
      }

 

      public int Get중성인덱스(string 중성)
      {
         string s = 중성;
         return 중성한글자소.Contains(s) ? 중성한글자소.IndexOf(s) : 중성대응영문자.IndexOf(s);
      }

 

      public int Get종성인덱스(string 종성)
      {
         string s = 종성;
         return 종성한글자소.Contains(s) ? 종성한글자소.IndexOf(s) : 종성대응영문자.IndexOf(s);
      }

 

      public string[] Get분해된자소(string str, bool 무받침제거)
      {
         if (str == "") return null;

         List<string> list = new List<string>();
         int uniValue;   // 유니코드 상의 글자 위치
         int iTemp;
         string s;

         for (int n = 0; n < str.Length; n++)
         {
            uniValue = 0;
            s = str.Substring(n, 1);
            byte[] bytes = Encoding.Unicode.GetBytes(s);
            // 빅앤디안 방식이지만 아래 계산 편이를 위해 리틀앤디안으로 변환

 

            // 유니코드 상의 글자 위치 구하기
            for (int b = 0; b < bytes.Length; b++)
            {
               uniValue += (int)(bytes[b] * Math.Pow(256.0, b));
            }

            if (uniValue < 한글코드시작점) { list.Add(s); continue; }

 

            // 초성
            list.Add(초성한글자소[(uniValue - 한글코드시작점) / 중종곱]);

 

            // 중성
            list.Add(중성한글자소[(uniValue - 한글코드시작점) % 중종곱 / 종성한글자소.Count]);

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

            // 종성
            iTemp = (uniValue - 한글코드시작점) % 종성한글자소.Count;
            if (무받침제거 && iTemp == 0) continue;
            list.Add(종성한글자소[iTemp]);
         }

         return list.ToArray();
      }
   }
}
 

 

 

 

<Form1.Designer>

namespace Test3
{
   partial class Form1
   {
      /// <summary>
      /// 필수 디자이너 변수입니다.
      /// </summary>
      private System.ComponentModel.IContainer components = null;

      /// <summary>
      /// 사용 중인 모든 리소스를 정리합니다.
      /// </summary>
      /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
      protected override void Dispose(bool disposing)
      {
         if (disposing && (components != null))
         {
            components.Dispose();
         }
         base.Dispose(disposing);
      }

      #region Windows Form 디자이너에서 생성한 코드

      /// <summary>
      /// 디자이너 지원에 필요한 메서드입니다. 
      /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
      /// </summary>
      private void InitializeComponent()
      {
         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
         this.textBox1 = new System.Windows.Forms.TextBox();
         this.label1 = new System.Windows.Forms.Label();
         this.label2 = new System.Windows.Forms.Label();
         this.textBox2 = new System.Windows.Forms.TextBox();
         this.btn조립하기 = new System.Windows.Forms.Button();
         this.textBox3 = new System.Windows.Forms.TextBox();
         this.label3 = new System.Windows.Forms.Label();
         this.label4 = new System.Windows.Forms.Label();
         this.tb분해할문자열 = new System.Windows.Forms.TextBox();
         this.label5 = new System.Windows.Forms.Label();
         this.textBox5 = new System.Windows.Forms.TextBox();
         this.btn분해하기 = new System.Windows.Forms.Button();
         this.chk무받침생략 = new System.Windows.Forms.CheckBox();
         this.SuspendLayout();
         // 
         // textBox1
         // 
         this.textBox1.Location = new System.Drawing.Point(12, 24);
         this.textBox1.Name = "textBox1";
         this.textBox1.Size = new System.Drawing.Size(376, 21);
         this.textBox1.TabIndex = 0;
         this.textBox1.Text = "ㅇ,ㅏ,ㄴ\"ㄴ,ㅕ,ㅇ\"ㅎ,ㅏ\"ㅅ,ㅔ\"ㅇ,ㅛ\" , \"ㅁ,ㅏ,fr\"ㄱ,ㅗ\"ㅂ,ㅏ,ㄺ\"r,p";
         // 
         // label1
         // 
         this.label1.AutoSize = true;
         this.label1.Location = new System.Drawing.Point(12, 9);
         this.label1.Name = "label1";
         this.label1.Size = new System.Drawing.Size(311, 12);
         this.label1.TabIndex = 1;
         this.label1.Text = "조립할 한글자소 입력  ( ,로 자소구분하고 \"로 글자분리 )";
         // 
         // label2
         // 
         this.label2.AutoSize = true;
         this.label2.Location = new System.Drawing.Point(103, 51);
         this.label2.Name = "label2";
         this.label2.Size = new System.Drawing.Size(69, 12);
         this.label2.TabIndex = 2;
         this.label2.Text = "조립된 한글";
         // 
         // textBox2
         // 
         this.textBox2.Location = new System.Drawing.Point(105, 66);
         this.textBox2.Name = "textBox2";
         this.textBox2.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
         this.textBox2.Size = new System.Drawing.Size(283, 21);
         this.textBox2.TabIndex = 3;
         // 
         // btn조립하기
         // 
         this.btn조립하기.Location = new System.Drawing.Point(12, 51);
         this.btn조립하기.Name = "btn조립하기";
         this.btn조립하기.Size = new System.Drawing.Size(85, 319);
         this.btn조립하기.TabIndex = 4;
         this.btn조립하기.Text = "조립하기";
         this.btn조립하기.UseVisualStyleBackColor = true;
         this.btn조립하기.Click += new System.EventHandler(this.btn조립하기_Click);
         // 
         // textBox3
         // 
         this.textBox3.Location = new System.Drawing.Point(105, 121);
         this.textBox3.Multiline = true;
         this.textBox3.Name = "textBox3";
         this.textBox3.ScrollBars = System.Windows.Forms.ScrollBars.Both;
         this.textBox3.Size = new System.Drawing.Size(283, 249);
         this.textBox3.TabIndex = 5;
         // 
         // label3
         // 
         this.label3.AutoSize = true;
         this.label3.Location = new System.Drawing.Point(103, 106);
         this.label3.Name = "label3";
         this.label3.Size = new System.Drawing.Size(53, 12);
         this.label3.TabIndex = 2;
         this.label3.Text = "유니코드";
         // 
         // label4
         // 
         this.label4.AutoSize = true;
         this.label4.Location = new System.Drawing.Point(410, 9);
         this.label4.Name = "label4";
         this.label4.Size = new System.Drawing.Size(109, 12);
         this.label4.TabIndex = 1;
         this.label4.Text = "분해할 문자열 입력";
         // 
         // tb분해할문자열
         // 
         this.tb분해할문자열.Location = new System.Drawing.Point(412, 24);
         this.tb분해할문자열.Multiline = true;
         this.tb분해할문자열.Name = "tb분해할문자열";
         this.tb분해할문자열.Size = new System.Drawing.Size(376, 63);
         this.tb분해할문자열.TabIndex = 0;
         this.tb분해할문자열.Text = "시간이 바람처럼 간다";
         // 
         // label5
         // 
         this.label5.AutoSize = true;
         this.label5.Location = new System.Drawing.Point(410, 106);
         this.label5.Name = "label5";
         this.label5.Size = new System.Drawing.Size(69, 12);
         this.label5.TabIndex = 2;
         this.label5.Text = "분해된 한글";
         // 
         // textBox5
         // 
         this.textBox5.Location = new System.Drawing.Point(412, 121);
         this.textBox5.Multiline = true;
         this.textBox5.Name = "textBox5";
         this.textBox5.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
         this.textBox5.Size = new System.Drawing.Size(276, 249);
         this.textBox5.TabIndex = 3;
         // 
         // btn분해하기
         // 
         this.btn분해하기.Location = new System.Drawing.Point(703, 93);
         this.btn분해하기.Name = "btn분해하기";
         this.btn분해하기.Size = new System.Drawing.Size(85, 277);
         this.btn분해하기.TabIndex = 4;
         this.btn분해하기.Text = "분해하기";
         this.btn분해하기.UseVisualStyleBackColor = true;
         this.btn분해하기.Click += new System.EventHandler(this.btn분해하기_Click);
         // 
         // chk무받침생략
         // 
         this.chk무받침생략.AutoSize = true;
         this.chk무받침생략.Location = new System.Drawing.Point(522, 102);
         this.chk무받침생략.Name = "chk무받침생략";
         this.chk무받침생략.Size = new System.Drawing.Size(156, 16);
         this.chk무받침생략.TabIndex = 6;
         this.chk무받침생략.Text = "받침없는 글자 종성 생략";
         this.chk무받침생략.UseVisualStyleBackColor = true;
         // 
         // Form1
         // 
         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
         this.ClientSize = new System.Drawing.Size(804, 382);
         this.Controls.Add(this.chk무받침생략);
         this.Controls.Add(this.textBox3);
         this.Controls.Add(this.btn분해하기);
         this.Controls.Add(this.btn조립하기);
         this.Controls.Add(this.textBox5);
         this.Controls.Add(this.textBox2);
         this.Controls.Add(this.label3);
         this.Controls.Add(this.label5);
         this.Controls.Add(this.label2);
         this.Controls.Add(this.label4);
         this.Controls.Add(this.label1);
         this.Controls.Add(this.tb분해할문자열);
         this.Controls.Add(this.textBox1);
         this.Name = "Form1";
         this.Text = "한글 조립";
         this.Load += new System.EventHandler(this.Form1_Load);
         this.ResumeLayout(false);
         this.PerformLayout();

      }

      #endregion

      private System.Windows.Forms.TextBox textBox1;
      private System.Windows.Forms.Label label1;
      private System.Windows.Forms.Label label2;
      private System.Windows.Forms.TextBox textBox2;
      private System.Windows.Forms.Button btn조립하기;
      private System.Windows.Forms.TextBox textBox3;
      private System.Windows.Forms.Label label3;
      private System.Windows.Forms.Label label4;
      private System.Windows.Forms.TextBox tb분해할문자열;
      private System.Windows.Forms.Label label5;
      private System.Windows.Forms.TextBox textBox5;
      private System.Windows.Forms.Button btn분해하기;
      private System.Windows.Forms.CheckBox chk무받침생략;
   }
}

 

 

 

 

-- 한글 유니코드 표 --

텍스트 파일로 첨부했습니다.

 

 

 

 

 

 

 

※ 참고 자료 (두벌식 자판 vs. 세벌식 자판) - 위-ㅋ 키

 

1. 두벌식 자판

 

두벌식 자판은 닿소리와 홀소리가 서로 다른 글쇠에 배치된 한글 입출력 방식들을 총칭한다.

현재 대한민국의 국가 표준은 모두 두벌식 자판 기반이다.

두벌식이라고만 하면 이 표준 두벌식 자판들을 가리키기도 한다.

 

대한민국의 표준 두벌식 자판은 1982년에 제정된 KS X 5002 “정보처리용 건반 배열”로 표준화되어 있다.

 

[1] 이 자판은 왼손에는 자음, 오른손에는 모음을 배치하여 자음-모음 또는 자음-모음-자음 순서대로 한글 한 글자를 입력하도록 한 것이다.

흔히 쌍자음 5자(ㄲ, ㄸ, ㅃ, ㅆ, ㅉ)와 모음 2개(ㅒ, ㅖ)가 표준에 규정되어 있는 것으로 알고 있다.

 하지만, 엄격하게 규정된 것이 아니고 Shift 키와 글쇠를 함께 눌러서 입력할 수 있다고 권장사항처럼 규정되어 있다.

 또 KS의 규정에 쌍자음은 단자음을 거듭 쳐서 구현할 수 있고, 모음 ㅒ, ㅖ도 조합할 수 있다고 되다.

 하지만, 쌍자음은 받침과 초성의 관계 때문에 일반으로 거듭쳐서 구현할 수 없다.

 거듭쳐서 구현하기 위해서는 구분자가 필요하다.

 기타 ㄳ과 같은 겹받침 및 ㅘ와 같은 이중모음은 보이는 대로 두 글쇠를 연속해서 눌러 입력한다.

 다만 ㅐ,ㅔ,ㅒ,ㅖ는 실제로는 조합되지 않고 합자꼴 자체로 입력해야 한다.

 

 북한의 표준 자판은 두벌식으로서, 한국의 표준 자판의 영향을 많이 받았다.

 조선민주주의인민공화국의 국규 9256에 규정되어 있다.

 이 표준은 국제적으로 KPS 9256이라고 부른다.

 처음 1991년 26키에 치환방식(예, ㄱ+ㅏㅏ=까, ㄱ+ㅓㅓ=꺼)을 국제표준 시안으로 제출했었다.

 그러나 어문생활과의 정합성 결여로 사용될 수 없었고 결국 1993년 표준으로 결정되었다.

 한국과 자음, 모음 영역은 같으나 배열만 차이가 있다.

 모음 중 ㅠ 하나만 좌측에 있는 것도 한국의 표준 자판과 같다.

 입력 방식도 같다.

 

 

2. 세벌식 자판

 

 세벌식 자판은 첫소리(초성) 한 벌, 가운뎃소리(중성) 한 벌, 끝소리(종성) 한 벌을 다른 글쇠 자리에 나누어 놓은 한글 자판들을 일컫는다.

 좁은 뜻으로 공병우가 개발한 배열에 기초한 공병우 계열 자판들을 가리키기도 한다.

 하지만, 1990년대부터는 공병우 계열이 아닌 세벌식 자판들이 주로 속기를 목적으로 쓰이고 있으므로 계열을 구분할 필요가 생겼다.

 

 세벌식 자판은 컴퓨터의 정보처리 관점에서 첫소리, 가운뎃소리, 끝소리의 개념을 일관성 있게 유지할 수 있다.

 한글에서 닿소리를 첫소리와 끝소리로 가려 쓰는 것을 로마자와 견주면, 대문자 C와 소문자 c를 다르게 알아차리는 것처럼

 첫소리 ㄱ과 끝소리(받침) ㄱ은 위상이 다르다.

 세벌식 자판은 두벌식 자판보다 구현 오토마타가 단순하다.

 다양한 겹닿소리가 쓰이는 옛 한글을 넣을 때에는 치는 이가 낱내(음절)를 끊어 줄 필요가 없다.

 때문에 세벌식 자판이 두벌식 자판보다 편리하다.

 모아치기를 통하여 타자 속도를 높이기 좋다.

 

 처음으로 널리 쓰인 세벌식 자판은 공병우가 1949년에 수동 타자기를 개발하면서 만든 자판이다.

 이른바 공병우 자판은 수동 타자기/전신 타자기/전동 타자기 등 여러 기종에 맞추어 쓰였다.

 공병우는 여러 기기에 맞추면서 앞서 내놓은 자판 배열을 보완하는 작업을 거듭했다.

 그리하여 스스로 세운 사설 문화 단체인 한글 문화원을 통하여 1991년에 3-91 자판(공병우 최종 자판)을 발표할 때까지 자판 개량 작업을 이어 갔다.

 전자 기기인 셈틀에서도 타자기에서 이어진 공병우 자판이 쓰이고 있다.

 

 한글문화원에서 발표한 3-90 자판과 3-91 자판(공병우 최종 자판)은 1990년대부터 윈도나 리눅스 및 매킨토시의 OS X 등 주요 운영체제들의 기본 입력기들이 지원하여 널리 쓰이고 있는 세벌식 자판 배열이다.

 세벌식 자판은 두벌식 자판보다 쓰는 이가 적고, 아직 어느 배열도 국가 표준 규격으로 채택되지 않았다.

 세벌식의 적극적인 주장자들은 공병우 자판의 비판을 허용하지 않는 경향이 있다.

 그러나, 사실 타자기에서 출발한 설계이기 때문에 컴퓨터에는 적합하지 않은 요소, 예를 들어 글자의 과잉한 할당을 하였다.

 또 모바일 기기에서 4 줄이 사용되는 점이 단점으로 지적된다.

 하지만 공병우 자판 주장자들은 대개 이러한 단점을 인정하지 않으며, 위키백과와 같은 집단 지성의 편집에서도 이러한 비판적인 글은 삭제하곤 한다.

 공병우 자판의 철학, 즉 세벌식의 개념을 계승하되 컴퓨터 시대에 적합한 설계를 하는 것이 앞으로의 숙제라고 볼 수 있다.

 

 1990년대 이후에도 공병우 자판을 개선/응용하거나 다른 배열/입력 방식을 쓴 세벌식 자판들이 개발되고 있다.

 이들은 상용화되어있지 않고 운영체제에 반영되어 있지 않으므로 특정한 것을 설명하는 것은 무의미하다.

 전자식 입력 특성을 활용하여 특수한 세벌식으로서 1995년에 신광조는 공병우 자판과 비슷한 배열을 쓰면서 윗글쇠(⇧ Shift)를 쓰지 않고 한 글쇠로 두 한글 낱자를 넣게 한 신세벌식 자판을 내놓았다.

 2003년에는 안마태가 컴퓨터 자판에서 모아치기를 할 수 있게 만든 안마태 소리 글판을 발표하였다.

 

 2009년 김국은 한글 자모 24자에 받침 14자만으로 충분하다는 주장으로 38자판을 발표하였다.

 

[출처] https://newseoul.tistory.com/38

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
100 Visual Studio 2010 Ultimate 정식버전 전환, 정식버전, 정식버전 사용 졸리운_곰 2020.07.26 44
99 Selenium C# Webdriver Tutorial: NUnit Example file 졸리운_곰 2020.01.03 68
98 VB로 웹페이지 읽어오기 - 웹 스크랩 file 졸리운_곰 2020.01.03 183
97 [C# 인공지능] 유전 알고리즘 : 유전 알고리즘으로 컴퓨터 자동 프로그래밍 AI-Programmer file 졸리운_곰 2019.12.28 231
96 C# 기초로 한글 검색기(초성 포함) 만들기 [Step by Step] file 졸리운_곰 2019.12.11 1417
» (C#.NET 한글 프로그램 제작) 한글 조립 및 분해 하기 (유니코드 Unicode) file 졸리운_곰 2019.12.11 272
94 C#에서 유니코드를 이용한 한글 자모 분리와 결합 졸리운_곰 2019.12.11 1215
93 [C#] GUID 생성. file 졸리운_곰 2019.02.27 166
92 MetaWeblogAPI VisualBasic .NET 코드 샘플 졸리운_곰 2019.02.08 272
91 MetaWeblogAPI C# 코드 샘플 졸리운_곰 2019.02.08 252
90 A Look into the Future - Source Code Generation by the Bots file 졸리운_곰 2019.01.23 164
89 Machine Learning with ML.Net and C#/VB.Net file 졸리운_곰 2018.12.14 463
88 Scientific graphics in C# - [part 2] file 졸리운_곰 2018.12.06 3911
87 Scientific graphics in C# [part 1] file 졸리운_곰 2018.12.06 144
86 Window 7 Enterprise 64bit에 vb6 (visual studio 6.0 ent버젼) 설치 file 졸리운_곰 2018.12.04 363
85 Application Trial Maker file 졸리운_곰 2018.11.22 191
84 C# 프로젝트에서 C++ 코드 사용 : Use C++ codes in a C# project — unmanaged C++ solution 졸리운_곰 2018.10.30 199
83 C# 으로 구현하는 간단한 뉴럴네트워크 : Implementing Simple Neural Network in C# file 졸리운_곰 2018.10.30 326
82 Machine Learning with ML.Net and C#/VB.Net file 졸리운_곰 2018.08.16 827
81 오픈소스 닷넷 라이브러리 Awesome .NET! file 졸리운_곰 2018.07.08 2190
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED