Download presentation
Presentation is loading. Please wait.
Published byHengki Darmadi Modified 5년 전
1
Visual Studio 2010 프로젝트 생성하기 PC화면에서 Visual Studio 2010 아이콘을 더블클릭 하거나
아니면 시작메뉴에서 Microsoft Visual Studio 2010을 클릭한다. 프로젝트 생성하기 Visual Studio 메인 화면이 나타나면 파일메뉴 -> 새로 만들기 -> 프로젝트를 클릭한다.
2
새프로젝트 생성 창이 나타나면 Visual C# -> Windows -> 빈 프로젝트를
선택하고 … 4번 설명으로 입력 창에 이름: Hello, 위치: 바탕화면 (찾아보기로 선택) 솔루션 이름: 의료IT공학과_동기유발학기 라고 입력한 후 확인 버튼을 누른다. 바탕화면을 확인해 보면 솔루션 폴더가 생긴 것을 볼 수 있고.. 이 폴더를 더블 클릭하여 열어보면 그 안에 프로젝트폴더가 있고 또 확장자가 .sln 인 파일이 있다. 다음에 이 솔루션을 다시 열 때는 이 .sln파일을 더블 클릭한다.
3
(앞 그림에서 계속) 현재까지 한 일을 정리해 보면 ..
‘의료IT공학과_동기유발학기’ 라는 솔루션 을 만들었고 그 안에 ‘Hello’ 라는 이름의 프로젝트가 생성된 것이다. 하나의 솔루션을 만들면 그 안에 여러 개의 프로젝트를 만들 수 있다. 하나의 프로젝트는 하나의 실행파일이나 .dll 파일에 해당한다. 하나의 솔루션에는 서로 관련 있는 프로젝트들을 생성하는 것이 원칙이다. 만약에 완전히 다른 성격의 프로그램을 만들 때는 솔루션을 처음부터 다시 만드는 것이 좋다. 7. Visual Studio 2010 화면을 살펴보면 아래와 같이 창의 오른 쪽 혹은 왼쪽에 솔루션 탐색기가 있고 그 안에 ‘의료IT공학과_동기유발학기’ 라는 솔루션이 있고 그 밑에 Hello라는 프로젝트가 달려 있는 것을 볼 수 있다. 또, ‘Hello’ 밑에는 참조라는 아이콘이 차일드로 달려 있는 것을 볼 수 있다. 솔루션 탐색기는 프로그래머가 원하는 위치로 끌어서 옮길 수 있다.
4
필요한 파일 추가하기 8. 앞의 5번에서 설명한 대로 .sln 확장자 파일을 더블 클릭하여 Visual Studio 2010을
5번에서 열었던 폴더의 ‘의료IT공학과_동기유발학기.sln’ 파일을 더블 클릭한다. 방금 닫았던 Visual Studio 2010의 창이 다시 나타난 것을 확인하자. 이제부터 하나의 어플리케이션과 윈도우를 만들어서 화면에 띄우는 프로그램을 작성한다. 필요한 파일 추가하기 1. 먼저 솔루션 탐색기에서 Hello프로젝트 밑의 ‘참조’를 마우스 오른쪽으로 클릭하여 나타난 팝업메뉴 창에서 ‘참조추가’를 마우스 왼쪽버튼으로 선택한다. 옆의 대화 창이 나타나면 .NET탭을 선택 한 후 다음의 다섯 개의 파일들을 선택한다. (Ctrl 키를 누르고 마우스 왼쪽 버튼으로 클릭하면 여러 개의 파일을 한번에 선택할 수 있다) PresentationCore PresentationFramework System System.Xaml WindowsBase
5
Hello 프로젝트의 참조 밑에 앞에서 선택한 다섯 개의 파일이 선택 된 것을
확인하다. 이번에는 코딩을 할 텍스트 파일을 추가한다. 먼저 Hello 프로젝트를 마우스 오른쪽으로 클릭한 후 -> 추가 -> 새 항목 을 마우스 왼쪽으로 차례로 선택한다. 5. 새 항목 추가 창이 나타나면 코드 -> 코드파일 을 선택하고 파일 이름을 입력한다. 파일명: Hello.cs 파일명을 프로젝트명과 반드시 같게 줄 필요는 없지만 이런 경우 같이 주는 것이 좋다.
6
명령어 편집창(코딩창) 아래 화면을 보면 방금 추가한 “Hello.cs”라는 C# 텍스트 파일이 Hello프로젝트에
추가 되고 왼쪽의 명령어 편집 창에 해당 파일이 열려 있는 것을 확인할 수 있다. 이 곳에서부터 C# 언어를 사용하여 명령어를 코딩한다. 옆에 있는 줄 번호는 사용하는 Visual Studio의 설정에 따라서 화면에 나타나지 않을 수도 있다. 명령어 편집창(코딩창)
7
명령어 코딩하기 명령어 편집창에 아래의 코드를 똑 같이 코딩한다.
파일이 있다면 복사(Ctrl+C)해서 붙여넣기(Ctrl+V) 해도 된다. //어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ app.Run(); }//Main }//class Hello }//pjkim.Hello
8
프로그램 컴파일하고 실행하기 아래의 그림은 입력이 완성된 화면이다. 코딩에 입력 에러가 없는지 확인하고
아래의 그림은 입력이 완성된 화면이다. 코딩에 입력 에러가 없는지 확인하고 Ctrl + F5를 눌러서 프로그램을 컴파일 한다. 이 때 입력 에러가 발생하면 컴파일 에러 메시지 창이 나타날 것이고 아무런 입력 에러가 없다면 생성된 실행파일이 실행되어서 다음 페이지와 같은 프로그램이 화면에 나타날 것이다.
9
프로그램 실행 결과 콘솔 출력 창 : Console.WriteLine("첫 번째 윈도우 프로그램");
의 명령어에 의하여 출력된 내용이 보인다. 윈도우 GUI 창 : win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; 클라이언트 창 (GUI 영역) 이 부분이 사용자 인터페이스 영역이다. 이 프로그램에서는 콘솔 창과 윈도우 GUI창이 모두 화면에 나타난다. 나중에는 불필요한 콘솔 창은 나타나지 않도록 지정할 수 있다. 현재는 콘솔 창이 있는 것이 편리하므로 그냥 둔다. 지금까지 C#언어를 사용하여 .NET 프레임워크를 사용하는 기초적인 프로그램을 작성하였다. 이런 스타일의 윈도우 프로그램을 WPF 프로그래밍 이라고 한다. 이 프로그램은 아무런 기능도 가지고 있지 않지만 앞으로 이 윈도우 창에 기능을 하나씩 더해 나갈 것이다. 지금까지 단계적으로 실행한 모든 절차를 외워서 5분 안에 코딩 할 수 있을 때까지 연습한다.
10
명령어 설명 (주석) 문장의 앞에 // 처럼 / 문자가 연속 두 번 이상 반복되는 것을 주석
//어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ app.Run(); }//Main }//class Hello }//pjkim.Hello 문장의 앞에 // 처럼 / 문자가 연속 두 번 이상 반복되는 것을 주석 이라고 한다. 주석이란 프로그램을 읽는 사람에게 설명을 하기 위한 내용을 담고 있는 경우가 대부분이다. 문장의 앞에 //를 붙이면 컴파일러는 그 위치에서부터 해당 줄의 끝까지의 내용을 컴파일 하지 않고 건너 뛴다. 따라서 주석은 프로그램의 명령어의 일부가 아니다. 이 기능을 사용하여 프로그램의 설명이 아닌 실제 명령어를 잠시 컴파일의 대상에서 제외하기 위하여서도 주석을 자주 사용한다. 또 아래와 같이 한번에 여러 줄을 주석 처리하기 위하여서는 /* .. */ 를 사용하기도 한다. 컴파일러는 /*를 만나면 */를 만날 때까지의 모든 내용(여러 줄)을 건너 뛴다.
11
명령어 설명 (using 지시문, namespace)
//어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ app.Run(); }//Main }//class Hello }//pjkim.Hello 프로그램의 맨 앞에 있는 using 지시문은 본문에서 사용 될 수도 있는 클래스 들이 정의되어 있는 name space를 미리 알려 주는 기능을 한다. name space란 하나의 프로그램에서 똑 같은 이름을 가진 두 개 이상의 클래스가 사용되는 경우에 충돌을 피하기 위해서 필요한 것이다. 만약 위의 using 지시문이 없다면 본문에서 Console.WriteLine("첫 번째 윈도우 프로그램"); 명령어는 System. Console.WriteLine("첫 번째 윈도우 프로그램"); 으로 코딩하고 Window win = new Window(); 명령어는 System.Windows. Window win = new System.Windows. Window(); 와 같이 길게 코딩하여야 한다. 이것은 불편한 일이다. 따라서 위와 같이 using 을 사용하여 흔히 사용되는 name space를 미리 알려주면 클래스 이름 앞에 name space를 일일이 붙여주는 불편을 피할 수 있다. name space가 붙여지지 않은 클래스인 경우 컴파일러는 주어진 name space를 적용하여 해당 클래스를 찾을 것이다. 마찬가지로 우리가 코딩하는 클래스들도 name space를 지정하여 그 안에 코딩 하는 것이 좋다. 이 프로그램에서 우리는 pjkim.Hello라는 name space를 사용하였다. name space 이름은 다른 name space 이름과 충돌하는 것을 될 수 있는 대로 피하기 위하여 유일한 이름을 사용하는 것이 좋다. 여기서는 이 목적으로 단순히 pjkim.Hello처럼 앞에 코딩자 이름의 이니셜을 사용했으나 실제는 이것보다 더 길고 충돌의 확률이 적은 이름을 생각해 내는 것이 현명한 방법이다. 소프트웨어 개발 회사라면 Microsoft등과 같이 회사의 등록된 명칭을 사용 했을 것이다.
12
위도우즈 프로그램에서는 반드시 [STAThread]
명령어 설명 (클래스, Main메소드, static 메소드) //어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ app.Run(); }//Main }//class Hello }//pjkim.Hello 위도우즈 프로그램에서는 반드시 [STAThread] 이 프로그램의 구조는 앞에서 설명한 name space인 pjkim.Hello 안에 하나의 클래스 Hello가 있고 그 안에 하나의 메소드(함수) Main이 있다. Main 메소드는 프로그램의 시발점이다. 따라서 Main 메소드는 우리의 프로그램 내에서 호출되는 것이 아니라 Runtime에 의해서 자동으로 호출되어야 한다. 따라서 반드시 미리 정해진 이름인 Main이 사용되어야 한다. 또한 Main 메소드는 클래스의 객체가 만들어지기 이전에 이미 존재해야 하므로 반드시 static 이어야 한다. 맨 앞의 접근자는 public이든 private이든 상관 없다. C#언어에서는 모든 메소드는 반드시 클래스 안에 코딩되어야 한다. 이 점이 C++과 다른 점이다. static 메소드에서 접근하는 모든 같은 클래스 내의 다른 멤버들도 반드시 static이어야 한다. 생각 해 보면 간단한 이유이다. 객체를 생성하기 이전에 이미 존재해야 하는 static 메소드에서 접근되기 위해서는 그 대상도 이미 존재하고 있어야 하기 때문이다.
13
프로그램 변경 1 => //app.run();
다른 부분은 그대로 두고 아래와 같이 app.Run();명령어를 주석처리 해 보자. (주석처리 한다는 것은 이 명령어를 임시로 제거 하는 효과가 있다고 앞에서 설명했음) 이 상태에서 Ctrl + F5 를 눌러서 프로그램을 다시 실행 해 보면 그림과 같이 콘솔 창은 화면에 나타나지만 GUI 윈도우 창은 잠깐 나타났다가 바로 사라지는 것을 볼 수 있다. 콘솔 창에는 프로그램이 종료 되었음을 알리는 메시지 (계속하려면 아무 키나 누르십시오 . . .)가 출력되어 있는 것을 볼 수 있다. 프로그램이 종료 된 것이다. 즉, win.Show(); 에 의하여 윈도우 창이 나타나지만 바로 프로그램이 종료되면서 윈도우 창도 사라지는 것이다. 이를 통해서 우리의 프로그램이 계속 실행되기 위해서는 app.Run(); 메소드가 실행되어야 한다는 것을 알 수 있다. Application 객체의 Run()메소드는 우리의 프로그램의 실행을 관장하는 메소드이다. //어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ //app.Run( ); }//Main }//class Hello }//pjkim.Hello
14
프로그램 변경 2 => //win.show(); app.run(win); 으로 변경
이번에는 아래와 같이 두 부분을 변경해 보자. 다른 부분은 그대로 두고 아래의 굵게 표시한 부분과 같이 ① win.Show(); 명령어의 앞에 //를 붙여서 //win.Show(); 로 주석처리하고 ② app.Run(); 명령어의 괄호 안에 win을 전달하여 app.Run(win); 으로 수정 그 후 다시 Ctrl+F5 를 눌러서 컴파일하고 실행하여 보면 프로그램이 정상으로 실행되는 것을 확인 할 수 있을 것이다. 이를 통하여 win.Show(); 명령어를 사용하여 Window객체의 Show()메소드를 호출하여 윈도우 창을 화면에 보여 줄 수 있지만 그렇게 하지 않고 Application객체의 Run() 메소드에 Window객체를 파라메터로 전달해도 같은 효과가 있음을 알 수 있다. Run(win); 과 같이 호출하면 Run() 메소드가 win객체의 Show()를 대신 호출한다. //어플리케이션을 생성해서 윈도우를 띄워주는 예제 프로그램 using System; using System.Windows; namespace pjkim.Hello { class Hello [STAThread] public static void Main() //콘솔 창에 적당한 문자열을 출력 해 보자. Console.WriteLine("첫 번째 윈도우 프로그램"); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; //윈도우를 화면에 보이도록 지정한다 //win.Show(); //어플리케이션 객체를 생성한다. Application app = new Application(); /*프로그램이 지속적으로 실행되도록 하기 위해서 어플리케이션의 Run함수를 호출 */ app.Run(win); }//Main }//class Hello }//pjkim.Hello
15
프로그램 변경 3 => Window객체 생성함수 사용하기
아래의 코드는 앞에서 보았던 Main()함수를 약간 바꾼 것이다. 기본적으로는 똑 같고 단지 객체 생성 순서를 바꾸고 주석을 일부 제거하였다. static void Main() { //어플리케이션 객체를 생성한다. Application app = new Application(); //윈도우 객체 생성 Window win = new Window(); //윈도우의 제목, 높이, 폭, 색깔을 지정한다. win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; app.Run(win); }//Main Window 객체 생성 Window 객체의 속성지정. 위와 같이 Main()함수에서 윈도우 객체를 생성하고 필요한 모든 처리를 하는 것은 좋은 프로그램의 구조가 아니다. Main()함수(메소드)는 프로그램의 시작점이라는 것 이외에 다른 의미를 부여하지 않는 것이 좋다. 이름도 그냥 Main()일 뿐 이 프로그램이 수행하는 기능에 대한 의미도 내포 되어 있지 않다. 따라서, Main()함수는 프로그램을 시작하는 장소로만 사용하고 프로그램을 시작하는데 꼭 필요한 코드만으로 제한하는 것이 좋다. 그 이외의 자세한 부분은 다른 함수(메소드)를 코딩하여 호출하는 방법을 사용하도록 하자. 프로그램을 다음과 같이 수정한다.
16
프로그램 변경 4 => Window객체 생성함수 사용하기
솔루션에 새로운 프로젝트를 추가하여(잠시 후 새 프로젝트 추가하는 방법 소개) 다음과 같이 코딩하여 Ctl+F5 로 실행해 보면 윈도우 창이 정상적으로 나타나는 것을 볼 수 있을 것이다. 일단 아래의 프로그램을 설명한 후 새 프로젝트 추가하는 방법을 설명한다. using System; using System.Windows; namespace pjkim.Hello { class Hello { [STAThread] // static void Main() Application app = new Application(); Window win = CreateWindow(); app.Run(win); }//Main static Window CreateWindow() Window win = new Window(); win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; return win; } }//class Hello }//pjkim.Hello Main()함수의 명령어는 단 세 줄로 줄어 들었다. CreateWindow() 함수 에서 실제로 Window객체를 생성하고 속성을 지정한 후 그 객체를 전달(return)한다. Window객체를 직접 생성 하는 대신 CreateWindow() 함수를 실행하여 전달(return) 되는 객체를 받는다.
17
프로그램 변경 4 => Window객체 생성함수 사용하기
이전의 Main()함수에서는 Window객체를 생성할 때 Window win = new Window(); 명령을 사용하여 직접 생성하였다. 그러나 앞의 프로그램에서는 아래와 같이 코딩이 바뀐 것을 볼 수 있다. Window win = CreateWindow(); 여기서 등호(대입연산자) 오른 쪽의 CreateWindow() 는 Main()함수 아래에 있는 우리가 코딩 한 함수로서 아래와 같은 구조로 되어 있다. static Window CreateWindow( ) { 명령어1 명령어2 : } 위의 함수에서 CreateWindow는 함수의 이름이다. Main함수를 제외한 모든 함수의 이름은 주어진 규칙에 따라 개발자가 임의로 정할 수 있다. 대부분의 함수의 이름은 그 함수가 수행하는 기능을 가장 잘 대변할 수 있는 이름을 사용한다. 함수이름 뒤에 있는 비어있는 괄호 ( )는 이 함수가 외부로부터 전달받는 값이 없음을 나타내고 있다(외부로부터 값을 전달 받는 경우는 나중에 볼 수 있을 것이다) 함수 이름 앞의 static Window에서 static은 Main 함수와 마찬가지로 객체의 생성 없이 호출될 수 있는 이미 만들어진 함수 인스턴스임을 의미한다. ( static 함수인 Main()에서 호출되는 함수 또한 static이어야 한다는 것은 앞에서 설명한 바 있다.) 그리고 그 뒤의 Window는 이 함수가 외부로 전달(return)하는 객체의 타입을 의미한다. 즉, 이 함수는 최종적으로 하나의 Window객체를 외부로 전달한다는 것을 알 수 있다. 즉, 한 줄로 설명하자면 CreateWindow함수는 외부로부터는 아무 값도 전달 받지 않고 그 내부에서 하나의 Window객체를 생성하여 외부로 전달하는 Static함수인 것이다. 다음 페이지에서 CreateWindow함수의 내부를 살펴본다.
18
프로그램 변경 4 => Window객체 생성함수 사용하기
아래와 같이 코딩하는 것을 함수를 정의한다고 한다. 즉 CreateWindow()라는 함수는 { } 사이에 있는 명령어로 구성됨을 선언하는 것이다. 이 명령어들은 그 자체로는 실행되지 않는다. 함수에 코딩된 명령어가 실행되려면 이 함수가 다른 함수에 있는 명령어에 의해서 호출되어야 한다. static Window CreateWindow() { Window win = new Window(); win.Title = "Hello(안녕하세요)"; win.Height = 200; win.Width = 400; return win; } Window객체를 생성 Window객체인 win의 속성을 지정 Window객체를 외부로 return 앞의 프로그램에서 함수 CreateWindow()는 Main()함수에서 아래와 같이 호출되었다. Window win = CreateWindow(); 위의 오른쪽과 같이 함수의 이름이(괄호를 포함하여) 명령어에 사용되면 이 함수가 호출되어 그 내부의 명령어가 실행된다. 그리고 실행이 끝나면 다시 호출된 명령어의 위치로 되돌아 가는데 이때 함수가 return한 값이 있으면 그 값이 함수 호출 문을 대치한다. 따라서 위의 Window win = CreateWindow();명령어가 실행되면 CreateWindow()함수가 return한 값(Window객체)이 왼쪽에 있는 win이라는 이름의 객체 변수(reference)에 저장(대입)되는 것이다. Window win = CreateWindow(); 에서 변수 win의 타입이 Window인 것과 CreateWindow()함수가 return하는 값의 타입이 Window로서 서로 일치하는 것을 볼 수 있을 것이다. 만약 이 타입이 일치하지 않는다면 컴파일 에러가 발생하여 프로그램이 실행되지 않았을 것이다. 모든 연산자는 같은 타입의 값만을 처리할 수 있다. Window win = CreateWindow(); 명령어에서 부호 = 는 대입연산자이다. 대입연산자 = 는 오른쪽의 값을 왼쪽에 있는 변수에 저장(대입)하는 기능을 수행한다.
19
프로그램 변경 5 => Main()함수를 좀 더 간단히
여기서 한 줄을 더 줄일 수 있다. static void Main() { Application app = new Application(); Window win = CreateWindow(); app.Run(win); }//Main 위의 Main()함수에서 가운데 줄에 선언된 객체 변수 win을 생각해 보자. Window win = CreateWindow(); 에 의하여 객체 변수(reference) win은 CreateWindow()함수가 return하는 Window객체를 받는다. app.Run(win); 에 의해서 win 객체는 Application 객체의 Run()함수에 전달된다. 즉, 객체 변수인 win은 단순히 CreateWindow()함수가 전달하는 객체를 받아서 Run()함수에 전달하는 일만 한다. 그 이외에는 존재 이유가 없다. 따라서 이런 경우에는 win변수를 거치지 않고 CreateWindow()함수가 return하는 Window객체를 app.Run()함수에 직접 전달하는 방법을 사용할 수 있을 것이다. 다음과 같이 코딩을 바꿔서 프로그램을 실행 해 보자. static void Main() { Application app = new Application(); app.Run(CreateWindow()); }//Main 프로그램이 아무 이상 없이 잘 실행되는 것을 확인 할 수 있을 것이다. 이 방법이 더 좋아 보인다.
20
프로그램 변경 5 => Main()함수를 좀 더 간단히
static void Main() { new Application().Run(CreateWindow()); } 위의 코딩에서는 Application객체 변수 app도 선언하지 않고 직접 생성된 Application객체를 바로 사용하여 Run() 함수를 호출한다. 프로그램을 위와 같이 수정하여 실행해 보자. 다음 페이지에서는 앞에서 언급한 대로 Visual Studio2010에서 현재의 솔루션에 프로젝트를 추가하는 방법에 대해서 설명한다. 그런 후 다시 윈도우를 생성하는 또 다른 방법에 대해서 설명 할 것이다
21
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
솔루션탐색기에서 솔루션제목을 마우스 오른쪽으로 클릭 한 후 추가 -> 새 프로젝트 를 차례로 선택(마우스 왼쪽으로) 위와 같이 새 프로젝트 대화 창이 나오면 빈프로젝트를 선택하고 프로젝트 이름은 SimpleMain 이라고 입력한 후 확인 버튼을 누른다. 다음->
22
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
솔루션 탐색기에 새로 추가한 프로젝트가 생성된 것을 확인 한 후 이 프로젝트에 앞에서 Hello프로젝트 처음 만들 때와 같이 필요한 참조와 코드 파일을 추가한다. 아래의 그림은 필요한 파일이 추가 된 후 코딩 준비가 되 상태이다. 필요한 .NET 참조 파일과 코드파일(SimpleMain.cs)이 추가되고 왼쪽에는 새로 추가한 코드파일의 편집창이 열려 있다.
23
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
아래는 편집창에 코들를 완성한 그림이다. 앞에서 설명한 프로그램에서 namespace이름과 클래스 이름이 바뀌었다. 그리고 앞의 프로그램과 구별하기 위하여 윈도우 타이들을 “SimpleWindow(Main함수를 간단히)”로 바꿨다. Ctl+F5를 눌러서 프로그램을 실행해 보고 윈도우의 타이틀이 바뀌었는지 확인 해 보자.
24
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
앞의 새로 코딩한 프로젝트가 실행되었다면 아래와 같이 타이틀이 바뀐 창이 화면에 나타날 것이다. 그러나 실제로는 아래와 같이 이전의 Hello.cs 프로그램이 다시 실행 되는 경우가 대부분일 것이다. 다음 페이지에서 그 이유와 해결 방법을 설명한다.
25
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
편집창에는 새로 코딩한 SimpleMain.cs 가 보이고 있다. 따라서 우리는 Ctl+F5를 누르면 이 프로그램이 실행될 것으로 기대 한다. 그러나 솔루션 탐색기에는 두 개의 프로젝트 중 처음에 만든 Hello가 진한 색으로 표시되어 있는 것을 볼 수 있다. 솔루션에 복수의 프로젝트가 있을 때에는 진하게 표시되어 있는 프로젝트가 실행되는 프로젝트이다. 이 것을 바꿔 주기 위해서는… 다음 ->
26
Visual Studio 2010 사용법: 시작프로젝트 지정하기
솔루션 탐색기에서 실행하고자 하는 프로젝트를 마우스 오른쪽으로 클릭하고 선택 창에서 시작 프로젝트로 설정 을 선택한다. 선택 창이 닫힌 후 확인 해 보면 선택한 프로젝트의 이름이 진하게 표시된 것을 확인할 수 있을 것이다. 이제 Ctl+F5르 누르면 선택한 프로젝트가 실행된다. 시작 프로젝트를 바꿔 주는 것이 귀찮다면 다음 페이지의 방법과 같이 솔루션의 속성 자체를 바꾸어 주는 방법도 있다.
27
Visual Studio 2010 사용법: 솔루션에 새 프로젝트 추가하기
솔루션 탐색기에서 솔루션제목을 마우스 오른쪽으로 클릭하고 속성을 선택해서 속성창을 연다. 아래와 같이 속성창이 열리면 라디오 버튼에서 현재 선택영역을 선택 하고 확인 버튼을 누른다. 이후로는 현재 편집 중인 파일이 항상 실행대상이 된다.
28
윈도우창을 만드는 또 다른 방법 앞에서 윈도우 창을 만들 때 처음에는 Main()함수에서 직접 Window객체를
생성하고 속성(Title, Width, Height 등)을 지정하는 방법을 사용하였다. 그 후에는 윈도우를 생성하고 필요한 속성을 지정하는 일을 전담하는 함수 (메소드) CreateWindow를 코딩하여 Main함수에서 호출하는 방법을 사용 함으로써 Main함수를 좀더 간단한 모습으로 바꿀 수 있었다. 이 두 번째 방법에서 CreateWindow함수를 static 함수인 Main()함수에서 호출 하기 위해서 CreateWindow함수 또한 static함수여야 한다는 것은 앞에서 충분히 설명하였다. CreateWindow함수에서 같은 클래스 내의 또 다른 함수를 호출해야 한다면 그 함수 또한 static이여야 할 것이고 이와 같은 관계는 계속되어야 할 것이다. 이것이 큰 문제가 될 것은 없지만 뭔가 미련해 보이지 않는가! 이런 문제를 좀 더 객체지향적인 느낌이 나도록 개선하기 위해서 우리는 우리 만의 Window 클래스를 만들 것이다. 그리고 그 클래스의 생성자 함수에서 윈도우의 모든 속성을 지정하는 방법을 설명할 것이다. 다음 예제를 사용해서 학생들은 namespace 안에 새 클래스를 코딩하는 방법과 클래스의 생성자가 무엇인지를 알게 될 것이다. 다음 예제에서 우리는 우리만의 Window클래스로 MyWindow라는 이름의 클래스를 만들것이다. 그런데 그것이 가능할까? Window클래스는 수많은 속성과 메소드를 가지고 있는 윈도우 프로그램의 기본적인 클래스로서 Microsoft사에서 미리 코딩해서 제공하는 클래스이다. 그 복잡하고 방대한 클래스를 우리가 직접 만들 수 있을까 걱정이 될 것이다. 그러나 걱정하지 않아도 된다. 우리는 Microsoft사가 제공하는 Window클래스를 그대로 복사해서 우리의 클래스 MyWindow 안으로 가져 올 것이다. 이것은 객체지향 프로그래밍의 용어로는 상속(Inheritance)라고 한다. 상속은 단순히 다른 클래스의 내용을 복사하는 것과는 다른 개념이다. 하지만 처음 공부하는 사람이 클래스의 상속이라는 개념을 이해하려고 고생하고 낙심하기 보다는 상속을 다른 클래스를 단순 복사하는 행위로 쉽게 생각하고 사용하는 것이 더 빠르게 배우는 방법이 될 것이다.
29
나만의 Window 클래스 코딩하기 우리의 솔루션에 MyWindow라는 이름의 프로젝트를 추가하고 다음과 같이
코딩하라.(소스코드파일명은 MyWindow.cs로 지정할 것) 코딩 후 Ctl+F5를 눌러서 테스트해 볼 것) using System; using System.Windows; //namespace안에는 두 개의 클래스가 있다. //하나는 Main()함수가 있는 Program이라는 클래스이고 //다른 하나는 Window클래스를 상속하는 MyWindow클래스이다. namespace pjkim.MyWindow { class Program [STAThread] static void Main() Application app = new Application(); app.Run(new MyWindow()); }//Main() }//class Program // // Window 클래스를 상속하는 MyWindow클래스를 정의한다. class MyWindow : Window //생성자 함수 : 클래스와 같은 이름의 함수(메소드) //생성자 함수는 클래스의 객체가 생성될 때 자동으로 실행된다. public MyWindow() Title = "Window를 상속한 MyWindow클래스"; Width = 400; Height = 200; } }//namespace
30
아래는 앞의 코드를 Visual Studio 2010에 코딩 한 화면을 캡쳐 한 것이다.
7~33 에 있는 namespace 안에는 두 개의 클래스가 코딩되어 있다. 9~18 사이에는 class Program이 있고 이 안에 static Main()함수가 있는 것을 확인하라. 22~32 사이에는 MyWindow라는 클래스가 코딩되어 있다. 22번 줄에는 class MyWindow : Window 라는 클래스의 헤드가 있는데 이것은 ‘MyWindow 는 기존의 Window를 상속하는 클래스’ 임을 정의하는 문장이다.
31
MyWindow 클래스 내부를 보면 26~31 줄에 MyWindow()라는 함수(메소드)가
정의되어 있는 것을 볼 수 있다. 클래스의 이름과 함수의 이름이 같은 것에 주목하라. 위와 같이 클래스의 이름과 같은 이름의 함수를 생성자(Constructor)라고 하는데 이 함수는 우리의 프로그램 내에서 임의적으로 호출되는 것이 아니고 이 클래스의 객체가 생성될 때 자동으로 실행되는 함수(메소드)이다. 아래의 Main()함수에서 MyWindow클래스의 객체가 new연산자에 의해서 생성되는 문장을 찾아보라. 15번 문장의 괄호 안에 있는 new MyWindow() 문장이 바로 MyWindow 클래스의 객체를 생성하는 명령어이고 이 명령어가 수행되는 과정에서 위의 생성자 MyWindow()가 자동으로 수행된다. 위의 생성자 함수 MyWindow()안에서는 생성된 윈도우의 속성값 (Title, Width, Height)이 지정되고 있는데 이 속성들은 모두 Window클래스에 있는 것들이다. 그러나 우리의 클래스인 MyWindow가 Window를 상속했기 때문에 이 들은 모두 MyWindow 클래스의 속성이 된 것이다. 이제 우리의 클래스인 MyWindow의 객체를 생성하면 곧 Window 객체가 생성되는 것이고 이 때 자동으로 실행되는 생성자를 윈도우의 속성을 지정하는 장소로 사용할 수 있다.
32
나만의 Window 클래스 코딩하기 2 다시 새 프로젝트를 만들고 (프로젝트명: MyWindow2, 소스파일명: MyWindow2.cs) 아래의 코드를 입력하고 테스트해 보라. 이 예제에서는 Window클래스를 상속한 MyWindow2 클래스 안에 Main()함수도 같이 코딩되어 있지 않다. 즉, 클래스가 하나뿐인 것을 확인하라. 앞으로 우리는 실습시간에 이 마지막 방법을 주로 사용할 것이다. 이 방법을 사용하여 프로젝트를 만들고 빈 창을 하나 출력하는 데 까지 5분 안에 할 수 있도록 연습하라. using System; using System.Windows; //Main()함수가 있는 class자체가 Window를 상속할 수 있다. namespace pjkim.MyWindow2 { class MyWindow2: Window [STAThread] //-- Main 함수 static void Main() { Application app = new Application(); app.Run(new MyWindow2()); }//Main() //-- 생성자 함수 public MyWindow2() Title = "Main 함수를 MyWindow안에"; Width = 400; Height = 200; }//MyWindow2() }//class MyWindow2 }//namespace
33
아래는 앞의 프로그램을 Visual Studio 2010에 코딩한 내용이고
그 아래에는 이 프로그램이 실행되어 생성된 윈도우 창이다. 몇 몇 중요한 부분을 사각형으로 표시해 놓았다. Window를 상속한 MyWindow2 클래스 Run()함수에 MyWindow2객체 전달 객체 생성시 자동으로 실행되는 생성자 함수 끝
Similar presentations