기술문서 14. 11. 12. 작성 C# 입문과맛보기 작성자 : 인천대학교 OneScore 김근호 address@outlook.kr Ⅰ. C# 이란무엇인가? p.1 Ⅱ. Hello World! p.3 Ⅲ. 메모장을만들어보자! p.4 가. 디자인 p.4 나. 소스코드 p.5 Ⅳ. 마치며.. p.8
I. C# 이란무엇인가 가. 정의 Microsoft의아네르스하일스베르가 2000년에고안한개발한객체지향프로그래밍언어로, 닷넷프레임워크의한부분으로만들었으며나중에 ECMA(ECMA-334) 와 ISO(ISO/IEC/23270) 의표준으로자리잡았다. C++ 와 JAVA와비슷한문법을가지고있다. 나. 언어특징 C# 은닷넷프로그램이동작하는닷넷플랫폼을가장직접적으로반영하고, 또한닷넷플랫폼에강하게의존하는프로그래밍언어이다. C# 은그문법적인특성이 C++ 과자바로부터많은영향을받았다. 자바와상당히유사하며 C# 을통하여다룰수있는닷넷플랫폼의기술들조차도자바를염두에둔것이많아서자바와가장많이비교되고있다. 하지만 C# 은자바와달리불안전코드 (unsafe code) 와같은기술을통하여플랫폼간상호운용성에상당히많은노력을기울이고있다. C# 의기본자료형은닷넷의객체모델을따르고있고, 런타임차원에서의쓰레기수집 (garbage collection) 이되며또한클래스, 인터페이스, 위임, 예외와같이객체지향언어로서가져야할모든요소들이포함되어있다. 다. C++ 과의차이점 C# 에는전역변수및전역함수가존재하지않으며, 클래스안에선언되어야하고, bool 함수는오직 true와 false의논리값만을가질수있다. 그리고상수또는정수형변수에서암시적으로변환이불가능하다. 직접대입을위해서는변환명령을이용해야한다. 또한, C# 은 static 키워드를오직한번만초기화를수행한다는의미로이용할수없다. C++ 에서의포인터는특정한형식의인스턴스또는주소값을가리키기위한목적으로할당되는주소값을기억하기위한변수로취급되지만 C# 에서의포인터는 System.IntPtr이라는하나의완성된형식에대한확장사양일뿐이다. 그래서 C++ 의포인터와같은쓰임새를 C# 으로이식할수없는경우가상당히많다. C# 은 C++ 과는달리부모클래스를하나만사용할수있다. 즉다중상속은불가능하며구현해야하는인터페이스는여러개를지정할수있다. 이점은다중부모클래스로부터의상속에서만누릴수있는이점을잃게되는단점을가지지만복잡성을최소화하고보다명료한상속관계의의미를만들수있다는부분이장점이다. - 1 -
라. C# 의계통도 마. 기타 C# 언어로작성된응용프로그램은크게콘솔어플리케이션과윈폼어플리케이션으로나뉜다. 콘솔어플리케이션은문자기반의명령프롬프트환경에서실행되는콘솔응용프로그램을의미하고, 키보드를통해입력하고실행결과를문자로출력한다. 그에반해윈폼어플리케이션은윈도우폼어플리케이션의약어이며일반적인윈도우응용프로그램과같이 GUI(Graphical User Interface : 그래픽사용자인터페이스 ) 를통해입출력을수행하고이벤트처리방식으로실행되는응용프로그램이다. 본문에서는 Hello World 기본예제와윈폼어플리케이션방식을이용한간단한메모장만들기실습으로 C# 맛보기를하려한다. - 2 -
II. Hello World 가 ) 콘솔어플리케이션예제 1). HelloWorld.cs 예제 i) 코드 using System; class HelloWorld public static void Main() Console.WriteLine("Hello World!"); ii) 실행결과 콘솔모드에서는일반적인 C 컴파일과같이커맨드창에텍스트로만뜨는것을확인할수있다. 나 ) 윈폼어플리케이션예제 1) HelloWorld.cs 예제 iii) 코드 using System; using System.Windows.Forms; class WinFormApp : Form WinFormApp() Text = "Hello World!"; public static void Main() Application.Run(new WinFormApp()); iv) 코드 윈폼모드에서는 GUI 형식인창이뜨고왼쪽상단에 Hello World! 가표시된것을볼수있다. - 3 -
III. 메모장을만들어보자! 가 ) 디자인 Visual Studio에서 C# 의새 Windows Forms을생성하면 Form1이란제목을가진기본창하나만덩그러니나온다. 이제메모장을만들기위해우선필요한버튼및기능을추가하여디자인하고자한다. 먼저아래의기능을도구상자에서끌어다추가시킨다. 메모장의기본기능인텍스트를입력받기위한텍스트박스. 프로그램상단의메뉴바로서, 기능별로그룹화시킬수있다. 상태를출력하는 Strip 으로줄, 문자개수를표시하기위함이다. 사용자가파일을열고저장하기위한대화상자이다. 위도구를추가함으로서메모장프로그램작성을위한최소한의디자인은준비되었다. 이제각기능의설정을통해사용자가생각하는메모장의구색을갖추고자한다. 프로그램크기에맞추기위해, 속성-레이아웃-Dock에서큰네모를클릭하여 Fill로맞추어주고, 디자인-(Name) 에서본인이원하는이름으로설정해준다. 본실습에서는 txtbox로하겠다. 또한여러줄입력을위해동작 Multiline은 True로바꾸고, 모양 ScrollBars 는 Both로맞춰줌으로서줄간이동을용이하게한다. 편집창에서원하는메뉴를하나하나입력할수있으나, 편의를위해클릭후오른쪽위의작은화살표를클릭하여, 표준항목삽입을하고불필요한메뉴만제거해준다. 본실습에서는표준항목에서파일 - 다른이름으로저장, 편집 다시실행, 도구탭그리고도움말탭에서정보를제외한모든메뉴를지우고, 대신서식탭을추가하여자동줄바꿈과글꼴을추가한다. 창하단의상태표시줄을선택하고, 하단화살표를눌러 StatusLabel 을클릭 하고, 속성 - 디자인 -(Name) 에서원하는이름으로설정해준다. 본실습에서는 statuslabel 로설정하였다. - 4 -
나 ) 소스코드 이제메모장의기본외형은갖추었고, 각기능들에알맞은소스코드를넣어주면된다. 먼저 MenuStrip 에해당하는소스코드를넣어보겠다. 넣는법은폼디자인창에서원하는탭의메뉴를더블클릭하면버튼클릭시실행할소스코드입력창이뜬다. 각메뉴에다음과같은소스코드를넣어주면된다. 1) 파일탭 if (txtbox.textlength > 0) // 텍스트가비어있지않으면아래메시지출력 DialogResult result = MessageBox.Show(openFileDialog1.FileName + " 을 ( 를 ) 저장하시겠습니까?", " 메모장 ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); switch (result)// 메세지박스의 result값 (Yes,No,Cancel) 을받아와서비교 case DialogResult.Yes:// Yes 면저장ToolStripMenuItem_Click(sender, e);// 저장이벤트실행 break; case DialogResult.No:// No면저장없이초기화 txtbox.text = null; break; txtbox.text = null;// 저장후메모장초기화 OpenFileDialog open = new OpenFileDialog(); // 도구상자에서추가한 OpenFileDialog를불러와객체생성. String filter = "Text Files(*.txt) *.txt All Files(*.*) *.*"; // 열고자하는파일확장자필터를정한다. open.filter = filter; // 정의한필터를 OpenFileDialog 필터에설정시켜준다. if (open.showdialog(this) == DialogResult.OK) // OpenFileDialog를표시한다. if (!string.isnullorempty(open.filename)) txtbox.text = System.IO.File.ReadAllText(open.FileName,Encoding.Default); // txtbox의텍스트를 OpenFileDialog로로드한파일로만듦. else return; - 5 -
SaveFileDialog save = new SaveFileDialog(); // 도구상자에서추가한 SaveFileDialog를불러와객체생성. String filename = save.filename; // SaveFileDialog의 FileName을 filename으로선언. String filter = "Text Files(*.txt) *.txt All Files(*.*) *.*"; // 저장할파일확장자필터선언. save.filter = filter; // 설정한필터를 Dialog필터에설정 save.title = " 저장 "; // 저장하기창제목설정 if (save.showdialog(this) == DialogResult.OK) // SaveFileDialog를표시. System.IO.File.WriteAllText(save.FileName, txtbox.text); // txtbox의모든텍스트를 file에저장한다. else return; System.Drawing.Printing.PrintDocument prntdoc = new System.Drawing.Printing.PrintDocument(); // prntdoc으로새로이선언한소스를인쇄 Click 이벤트밖에먼저써준다. 이코드를먼저밖에입력한뒤, 아래의코드를인쇄버튼클릭시나타나도록한다. PrintDialog print = new PrintDialog(); //PrintDialog를 print로선언 prntdoc.printpage += new System.Drawing.Printing.PrintPageEventHandler(prntDoc_PrintPage); //prntdoc_printpage를 prntdoc 프린트페이지의새로운이벤트핸들러로선언 print.document = prntdoc; //prntdoc를프린트할문서로설정. if (print.showdialog(this) == DialogResult.OK) // 프린트창출력 prntdoc.print(); PrintPreviewDialog preview = new PrintPreviewDialog(); // preview로 PrintPreviewDialog 선언 prntdoc.printpage += new System.Drawing.Printing.PrintPageEventHandler(prntDoc_PrintPage); // prntdoc_printpage을 prntdoc인쇄페이지의이벤트핸들러로선언 preview.document = prntdoc; // prntdoc을미리보기할문서로설정 if (preview.showdialog(this) == DialogResult.OK) // 미리보기창출력 prntdoc.print(); 위소스입력후, 바깥에다인쇄, 인쇄미리보기에쓰인 printdoc_printpage의정의를해줌. private void prntdoc_printpage(object sender, System.Drawing.Printing.PrintPageEventArgs e) Graphics g = e.graphics; g.drawstring(txtbox.text, txtbox.font, Brushes.Black, 0, 0); - 6 -
Close(); 2) 편집탭 txtbox.undo(); txtbox.cut(); txtbox.copy(); txtbox.paste(); txtbox.selectall(); 3) 서식탭 활성화여부확인을위해 check 모양으로바꾼다. 디자인에서자동줄바꿈메뉴오른쪽버튼클릭후 checked 클릭 this.txtbox.wordwrap =!(this.txtbox.wordwrap); // 클릭할때마다줄바꿈 complement 자동줄바꿈 ToolStripMenuItem.Checked =!( 자동줄바꿈 ToolStripMenuItem.Checked); // 클릭할때마다체크 on/off 글꼴사용을위해도구상자에서 fontdialog 를디자인에추가시켜준뒤아래의소스를입력한다. fontdialog1.showcolor = true; fontdialog1.showeffects = true; if (fontdialog1.showdialog(this) == DialogResult.OK) txtbox.forecolor = fontdialog1.color; txtbox.font = fontdialog1.font; - 7 -
4) 기타 // 메시지박스출력으로원하고자하는정보입력 MessageBox.Show(this, "C# 메모장 v1.0\n"+" 이제품은다음사용자에게허가됨.\n\n"+" 사용자 이름 : "+SystemInformation.UserName+"\n 컴퓨터이름 : "+SystemInformation.ComputerName); 줄, 글자수출력을위해최초로드, 텍스트입력시카운트되도록, txtbox_textchanged( 텍스트박스더블클릭 ) 와 Form1_Load( 프로그램창더블클릭 ) 두곳에입력한다. Int32 lines = txtbox.lines.length; Int32 textlength = txtbox.text.length; statuslabel.text = "Lines: " + lines + " Characters: " + textlength; IV. 마치며 C# 입문과맛보기라이름지은본기술문서를통해 C# 의개요및다른언어와의관계, 그리고개발환경차이를간단히확인하였다. 이문서가개념강좌가아닌맛보기인만큼, 자세한코드분석이나설명이없어완벽히이해는못하더라도메모장만들기실습을통해 C# 윈폼프로그래밍이이런것이라는감을잡았으면좋겠다. 실제로주변에서도대학입학후코딩수업이란코딩수업은주구장창콘솔창에텍스트만떠서흥미를느끼지못하다가 GUI 기반의 C# 윈폼프로그래밍으로다시프로그래밍에흥미를느끼는경우를봤기때문에, 혹컴퓨터공학도로서코딩에흥미가없다거나지레겁먹은사람이있다면, 이기회에좀더흥미를갖는계기가되었으면한다. - 8 -
참고문헌및사이트 l C# 입문이론과실습 ( 오세만, 생능출판사, 2005) l l C Sharp (programming language) by wikipedia http://wikipedia.org/wiki/c_sharp_(programming_language) Code Project - Empty path name is not legal Error http://www.codeproject.com/questions/402902/empty-path-name-is-not-legal-error - 9 -