A. namespace 키워드
namespace란?
프로그램은 메모리 상에 수 많은 저장 장소('변수')를 생성해서 사용하고 각 변수에 이름을 붙여 구별합니다.
프로그램 기법이 발전하면서 단순한 변수 외에도 같은 소(小)작업에 동원되는 여러 변수들을 하나로 묶어 변수들의 배열 같은 모습의 대형 변수를 만들 필요가 있었습니다. 그리고 이것을 구조체라고 불렀습니다. 그 이후 프로그램 기법은 구조체 내에 그 구조체 안에서만의 특별한 동작 기능을 추가(함수인데 특별히 '메소드'라 부름) 하고 이를 '클래스'라고 부르게 되었습니다. 이 클래스는 하나의 작은 프로그램 모듈의 붕어빵 틀같은 모양을 하고 있으며 그 자체로는 실행될 수 없고 실제 런타임 때, new 라는 키워드에 의해서 메모리에 업로드 되어 비로소 실행되는데, 이렇게 메모리에 업로드되어 하나의 독립 모듈이 된 상태를 '객체'라고 부릅니다. 즉, 프로그램 기법이 구조체를 도입하면서 급발전하여 곧바로 클래스를 만들어 객체화(캡슐화)시키자는 방향으로 발전한 것 입니다. 여기서 객체의 설계도라고 할 수 있는 것이 클래스 입니다. 객체화 프로그래밍의 장점은 코드를 편리하게 재사용 할 수 있고 수 많은 변수들을 체계적으로 분류하여 프로그래밍의 효율성을 높인다는 데에 있습니다.
다시 한 번 요약하자면, 어떤 소(小)작업을 위한 여러 변수들과 함수를 한 데 묶어 클래스라는 붕어빵 틀을 만들었습니다.
붕어빵 틀이 있으니 '이 틀로 객체를 만들어라!' 하는 명령만으로 무한대의 똑같이 생긴 붕어빵 객체들을 만들 수 있게 된 거죠. 때문에 현대의 프로그램에서 클래스는 소스 코드 작성의 핵심입니다. 그리고 그 클래스라는 붕어빵틀은 복사, 기능추가, 다형성(후에 설명함), 은폐성, 개선된 가독성등에서 강력한 잇점들을 프로그래머들에게 안겨 주었습니다.
C# 프로그램 소스에는 많은 클래스들이 포함되어 있습니다.
네임스페이스란, 대략적으로 말하자면 클래스가 나열된 공간입니다. (= 클래스들의 덩어리)
하나의 네임스페이스 안에서는 동일한 이름을 가진 클래스가 존재하면 안됩니다. 구별할 수 없으니까요.
클래스명의 중복을 불허 한다는 것은 하나의 네임스페이스 안에서의 얘기일 뿐, 다른 네임스페이스에 같은 이름의 클래스명이 있냐 없냐는 문제되지 않습니다. 네임스페이스란 이렇게 클래스들을 무리지어 놓는 하나의 구획입니다.
미리 정의되어 있는 대표적인 C#의 편리한 네임스페이스에는 System 이 있습니다.
B. using 키워드의 용도
using 키워드로 다른 네임스페이스에 정의된 클래스를 가져오거나
네임스페이스의 별칭을 정의해서 사용할 수 있습니다.
1. 다른 네임스페이스에 있는 클래스 가져오기
형식)
using 다른네임스페이스명;
using 다른네임스페이스명.클래스명; // 하위 클래스들은 .으로 구분
예문)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
2. 별칭 정의하기
C#의 네임스페이스 이름이나 클래스 이름들이 정말 긴 경우가 많습니다.
실생활 용어도 약어를 많이 사용하는데, 프로그램 코드에서도 약자를 쓰고 싶어 근질근질 합니다.
사용하는 전처리 지시자는 using (소문자임!) 입니다.
using으로 간략화 할 수 있는 대상은 네임스페이스 이름과 클래스 이름 뿐 입니다.
형식)
using 별칭 = 네임스페이스명;
using 별칭 = 네임스페이스명.클래스명;
예문)
using con = System.Console; // 별칭을 정의하고 있는 using 키워드
class Program
{
static void Main(string[] args)
{
con.WriteLine("으하하");
con.ReadLine();
}
}
별칭 사용시 고려할 점)
여러 사람들과 코드를 공유하면서 개발 하는 경우라면, 별칭 사용을 자제 하는 것이 좋을 수도 있습니다.
자신은 알아보기 쉽겠지만, 다른 사람들에겐 불편할 수 있으니까요!
'프로그래밍' 카테고리의 다른 글
(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]);
// 종성
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자판을 발표하였다.
'프로그래밍' 카테고리의 다른 글
(프로그래밍 강좌) HTML 5 강좌2 (0) | 2018.08.14 |
---|---|
(프로그래밍 강좌) HTML 5 강좌1 (0) | 2018.06.21 |
(웹 프로그래밍 팁) 젤로 몰드 (Jello Mold) 브라우저 페이지 폭 자동 조절 기법 (0) | 2018.06.13 |
(웹 프로그래밍 팁) 자바스크립트의 클로저 (0) | 2018.06.12 |
(PC 가상머신) VMWare와 파일 공유 방법. (XP-VMWare 공유 폴더) (0) | 2018.06.12 |
(ASP.NET 닷넷으로 데이터베이스 접속방법) C#으로 MySQL 접속하기
< C#에서의 MySql 서버 연결 및 사용 방법 >
1. .NET용 MySql 드라이버를 설치 한다.
- 경우에 따라 다르겠지만 본인의 경우에는 MySql 홈페이지에서 만든 드라이버를 설치 후 연결을 하니
euckr 문자셋이 없다는 에러를 내면서 도저히 연결이 되지 않았다.
그래서 데브피아에서 검색한 결과 ‘MySQLDriverCS’ 라는 드라이버를 알게 되어 이것을 설치 했다..
물론 연결이 아주 잘 되었다.
- 설치 및 사용 방법
여기에서 받는다. http://sourceforge.net/projects/mysqldrivercs
그런 후 설치를 한 후 프로젝트에서 참조 시킨다. 만약 참조 화면에 나타나지 않으면 수동으로
설치된 폴더에 가서 찾아서 참조 시킨다.
2. 서버 연결
- using MySQLDriverCS;
………..
MySQLConnection conn = new MySQLConnection( new MySQLConnectionString("localhost","mysql","root","").AsString );
MessageBox.Show("Connecting to database");
try
{
conn.Open();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
3. MySQLSelectCommand 를 사용한 쿼리
- 지정된 테이블의 모든 필드를 쿼리
DataTable dt = new MySQLSelectCommand(Connection, new string[]{"*"}, new string[] {"MoneyResult"}, null, null, null).Table;
foreach(DataRow row in dt.Rows)
{
int i = 0;
string AreaCode = row["AreaCode"].ToString();
++i;
}
- 특정 필드 쿼리
…………….
DataTable dt = new MySQLSelectCommand(DBConn,
new string[] {"SettingID","SettingValue"},
new string[] {"Settings"},
new object[,] {{"SettingID","=",SettingID}},
null,
null
).Table;
string Value = null;
if(dt.Rows.Count!=0)
{
Value = dt.Rows[0]["SettingValue] as string;
}
else
{
// Value not found
}
...
- WHERE 사용 방법
………………………………………………..
string StartDt = "2005-12-01 00:00:00"; // WHERE에서 값으로 사용한다.
string EndDt = "2005-12-01 23:59:59";
DataTable dt = new MySQLSelectCommand( Connection, new string[]{"*"}, new string[] {"ItemResult"},
new object[,]{ {"Dt",">=",StartDt},{"Dt","<=",EndDt} },
null, null).Table;
foreach(DataRow row in dt.Rows)
{
……………………
}
……………………………………………………..
- 원래는 쿼리는 MySQLCommand 와 MySQLDataReader를 이용하는 것이 보통 이지만 본인이
자세히는 모르지만 MySQLDataReader가 ADO.NET에 있는 비슷한 클래스와 같은 역할을 한다면
쿼리 후 페치를 할 때 마다 서버에 연결된 상태에서 값을 가져와야 되기 때문에 데이터가 작은
경우가 아니라면 성능에 좀 문제가 되지 않을까 해서 사용하지 않고 MySQLSelectCommand를
사용하고 있음.
………………………………………..
MySQLCommand cmd = new MySQLCommand("select host,user from mysql.user",conn);
MySQLDataReader reader = cmd.ExecuteReaderEx();
while(reader.Read())
{
ListViewItem lvi = new ListViewItem("Low Level - Host:"+reader.GetString(0)+" , User:"+reader.GetString(1));
lvData.Items.Add(lvi);
}
reader.Close();
cmd.Dispose();
……………………………………………………………
- DataAdapter 를 사용하여 쿼리 하는 방법
예)
………………………………………………..
string strQuery = "SELECT Dt, ItemCode, Cnt FROM ItemResult”;
MySQLDataAdapter DataAdapter = new MySQLDataAdapter();
MySQLCommand cmd = new MySQLCommand();
cmd.Connection = Connection;
cmd.CommandText = strQuery;
DataAdapter.SelectCommand = cmd;
DataSet ResultDataSet = new DataSet();
DataAdapter.Fill( ResultDataSet , "ItemResult" );
…………………………………………….
[출처] c#에서 mysql 접속하기
(N20091112)
'프로그래밍' 카테고리의 다른 글
(웹 프로그래밍 팁) 자바스크립트의 클로저 (0) | 2018.06.12 |
---|---|
(PC 가상머신) VMWare와 파일 공유 방법. (XP-VMWare 공유 폴더) (0) | 2018.06.12 |
(데이터베이스 오류 정보) [MySql]is not allowed to connect to this MySQL server (0) | 2018.06.12 |
(데이터베이스 연결도구) MDAC에 대해서... (0) | 2018.06.12 |
(웹 프로그래밍) 자바스크립트 강좌 (0) | 2018.06.11 |