본문으로 바로가기
반응형

 저번 포스팅에서는 GitHub랑 제 컴퓨터랑 연동하는 방법을 알아보았습니다. 오늘은 C#의 내용을 조금 나가고 윈폼에대해 조금 다뤄보는 시간을 가져보겠습니다.

 

 

제네릭

변수의 형을 매개변수로 하여 클래스나 메소드의 알고리즘을 자료형과 무관하게 기술하는 기법이다.

 

 

형 매개변수(type parameter)

클래스 내의 필드나 메소드 선언시 자료형으로 사용한다.

'<'과 '>' 사이에 형 매개변수의 이름을 기술 :  <T1, T2, T3, ... Tn>

 

 

장점

 1. 알고리즘의 재사용성을 높인다.

 2. 자료형에 따른 프로그램의 중복을 줄인다.

 3. 프로그램의 구조를 단순하게 만들어준다.

 

 

단점

프로그램 소스를 이해하지못하면 굉장히 복잡해진다.

 

 

제네릭 클래스

정의 형태)

[modifiers] clas ClassName<TypeParameters>
{
// ... class body
}

<TypeParameters>를 보통 <T>로 줄여서 많이 표현한다.

매개변수 class SimpleGeneric <T> { ... }

 

실제 형 인자(actual type argument)

제네릭 클래스에 대한 객체를 생성할 때 주는 자료형

new SimpleGeneric < int32 > (10);

 

 

제네릭 클래스 예시)  - 클래스 정의

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenericApp
{
    public class SimpleGeneric<T>
    {
        private T[] values;  // T타입(아무 타입이 가능한)의 배열 생성
        private int index;

        public SimpleGeneric(int len)  // 클래스 안에서 Alt + 엔터를 누르면 생성자를 생성할 수 있다.
        {
            values = new T[len];
            index = 0;
        }

        public void Add(params T[] args)
        {
            foreach (T item in args)  // foreach를 쓰고 탭 두번누르면 형식이 자동으로 완성된다
            {
                values[index++] = item;
            }
        }

        public void Print()
        {
            foreach (T item in values)
            {
                Console.Write(item + ", ");
            }
            Console.WriteLine();
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            SimpleGeneric<Int32> gInterger = new SimpleGeneric<int>(10);
            SimpleGeneric<Double> gDouble = new SimpleGeneric<Double>(10);

            gInterger.Add(1, 2);
            gInterger.Add(1, 2, 3, 4, 5, 6, 7);
            gInterger.Add(0);
            gInterger.Print();

            gDouble.Add(10.0, 20.0, 30.0);
            gDouble.Print();
        }
    }
} // 알트엔터로 생성자 생성할 수 있다!

 

비쥬얼 스튜디오에서 프로젝트와 GitHub 동기화 하는법

 

솔루션 탐색기에서 연동된 것을 확인해보자

 

솔루션 탐색기에서 소스코드 파일에 커밋 -> 모두 커밋 후 동기화를 눌러준다

 

GitHub에 방금 수정한 내용이 추가된 것을 확인할 수 있다(저는 컴파일 오류가 떠서 한번 더 수정했습니다.)

 

 

 

 

예외(execption)

- 실행시간에 발생하는 에러(run-time error)

- 프로그램의 비정상적인 종료

- 잘못된 실행 결과

- 메서드의 호출과 실행, 부정확한 데이터, 그리고 시스템 에러 등 다양한 상황에 의해 야기된다.

 

 

예외 처리(execption handling)

 기대되지 않은 상황에 대해 예외를 발생시킨다.

야기된 예외를 적절히 처리해야한다.(execption handler)

 

 

예외 처리를 위한 방법을 언어 시스템에서 제공

응용프로그램의 신뢰성(reliability) 향상

예외 검사와 처리를 위한 프로그램 코드를 소스에 깔끔하게 삽입

 

 

예외 정의

예외도 하나의 객체로 취급하기때문에 예외를 위한 클래스를 정의해야한다.

 

 

예외 클래스 

- 모든 예외는 형(Type)이 Exception 클래스 또는 그의 파생 클래스들 중에 하나로부터 확장된 클래스의 객체이다.

- 사용자는 Exception 클래스의 파생 클래스인 ApplicationException 클래스를 확장하여 새로운 예외 클래스를 정의하여 사용해야한다.

- 예외처리하게되면 실행하면 200~5000배까지 느려지기때문에 주의하여야한다.

- 예외를 명시적으로 발생시키면 예외를 처리하는 예외 처리기가 반드시 필요하고 예외에 관련된 메시지를 스트링 형태로 예외 객체에 담아 전달할 수 있다.

 

 

예외 클래스의 계층도

시스템 정의 예외 (system-defined exception)

- 프로그램의 부당한 실행으로 인하여 시스템에 의해 묵시적으로 일어나 는 예외

- SystemException클래스나 IOException 클래스로부터 확장된 예외

- CLR에 의해 자동적으로 생성

- 야기된 예외에 대한 예외 처리기의 유무를 컴파일러가 검사하지 않음 (unchecked exception)

 

 

프로그래머 정의 예외 (programmer-defined exception)

- 프로그래머에 의해 의도적으로 야기되는 프로그래머 정의 예외

- 프로그래머 정의 예외는 발생한 예외에 대한 예외 처리기가 존재하는지 컴파일러에 의해 검사(checked exception)

 

 

시스템 정의 예외의 종류

1. ArithmeticException : 산술 연산시 발생하는 예외

2. IndexOutOfRangeException :배열, 스트링, 벡터 등과 같이 인덱스를 사용하는 객체에서 인덱스의 범위가 벗어날 때 발생하는 예외

3. ArrayTypeMismatchException : 배열의 원소에 잘못된 형의 객체를 배정하였을 때 발생하는 예외

4. InvalidCastException : 명시적 형 변환이 실패할 때 발생하는 예외

5. NullReferenceException : null을 사용하여 객체를 참조할 때 발생하는 예외

6. OutOfMemoryException : 메모리 할당(new)이 실패하였을 때 발생하는 예외

 

 

예외 발생

묵시적 예외 발생

- 시스템 정의 예외로 CLR에 의해 발생

- 시스템에 의해 발생되므로 프로그램 어디서나 발생 가능

- 프로그래머가 처리하지 않으면 디폴트 예외 처리기(default exception handler)에 의해 처리

 

명시적 예외 발생

- throw문을 이용하여 의도적으로 발생

- 프로그래머 저으이 예외는 생성된 메서드 내부에 예외를 처리하는 코드부분인 예외 처리기를둬서 직접 처리해야한다.

 

 

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace execptionTestApp
{
    class Program
    {
        static void Main(string[] args)
        { 
            int x = 100;
            int y = 0;
            int Value = 0;
            Value = x / y;
            Console.WriteLine("{1} / {2} = {0}", x, y, Value);
            Console.WriteLine($"{x}/ {y} = value = {Value}");  // 문자열 처리방식
                                                               // 0으로 나누려고했기때문에 컴파일러는 오류로 인식한다.
                                                               // try-catch-finally구문으로 예외처리가 가능하다.
        }
    }
}

0으로 나눈다는것이 컴파일러는 오류로 인식하는 것을 확인할 수 있다

 

 

예외 처리

에러 처리 구문

try 블록 : 예외 검사

catch 블록 : 예외 처리

finally : 종결 작업, 예외 발생과 무관하게 반드시 실행

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace execptionTestApp
{
    class Program
    {
        static void Main(string[] args)
        { 
            
            int x = 100;
            int y = 0;
           // int y = 5;
            int Value = 0;

            try    // try를 쓰고 탭 두번 눌러주자
            {
                Value = x / y;
                Console.WriteLine("{1} / {2} = {0}", x, y, Value);
                throw new Exception("사용자 에러");
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine("2. y의 값을 0보다 크게 입력하세요");
            }
            catch (Exception ex)
            {
                Console.WriteLine("3. " + ex.Message);
            }
            finally
            {
                Console.WriteLine("\n4. 프로그램이 종료했습니다.");   // 에러가 있든없든 무조건 실행하는 구문이다
            }
        }
    }
}

y = 0 일때 실행했을때의 출력

 

y = 5일때 실행했을 때의 출력

throw는 일부러 에러를 내는 구문이다. 지금은 예시라서 쓴대로 출력되게했지만, 나중에 윈폼에 나오니까 다음에 자세히 알아보도록하자

 

윈폼

윈폼 애플리케이션

 - 윈폼은 컨트롤을 사용하여 프로그래머가 원하는 화면을 구성하고 이벤트가 발생했을 때, 처리하고자 하는 작업을 이벤트 처리기에 기술하는 방식으로 프로그래밍된 프로그램이다.

 - 윈도우 폼에 컨트롤 또는 컴포넌트를 배치하고 이벤트 처리기를 등록하여 사용자의 다양한 요구를 입력으로 받아 처리한 후 실행 결과를 응답해주는 방식으로 작동한다. 

 

윈도우 폼

 단순히 폼이라고 부르며, 운영체제에서 제공하는 기본적인 화면 단위인 창을 말하는 개념이다. 사각형 모양의 작은 화면 영역을 의미하며 사용자에게 정보를 제공하고 사용자가 입력하는 자료를 받는다.

 

폼 클래스

윈도우 폼을 나타내는 클래스이며 System.windows.Forms 네임스페이스에 속한다.

 

컴포넌트 클래스

컨트롤 클래스의 베이스 클래스이며 화면에 직접적으로 나타나지 않으나 개념적인 부분을 나타내는 클래스이다.

 

컨트롤 클래스

폼에 직접 표시되는 컨트롤을 위한 클래스이다.

 

생성된 프로젝트의 파일

 

 

 

윈폼을 실행해보자

 

 

소스코드

- Program.cs : 윈폼 응용 프로그램의 시작점을 포함하는 C# 소스파일

- Form1.cs : 윈폼 응용 프로그램의 C# 소스 파일

- Form1.Designer.cs : 윈폼 응용 프로그램 폼 디자인 정의를 포함하는 C# 소스파일

- WindowsApplication1.csproj : 윈폼 응용프로그램 프로젝트 파일

- Properties/AssemblyInfo.cs : 프로젝트가 생성하는 어셈블리를 설명하고 버전 관리 정보를 지정하는 데, 사용하며, 애트리뷰트 정의를 포함하는 C# 소스파일

- Properties/Resources.resx : 윈폼 응용 프로그램의 자원 파일

- Properties/Settings.Designer.cs : 프로젝트 설정에 대한 C# 정의를 포함하는 C# 소스파일

- Properties/Settings.settings : 프로젝트에 대한 설정 파일

 

 

Main() 메소드

 응용 프로그램의 시작점이며 Application 클래스의 Run() 메소드를 호출하여 응용 프로그램을 실행.

 

생성자

- 폼에서 사용하는 각종 컴포넌트와 클래스의 멤버 초기화

- 폼에 있는 각종 컴포넌트들 초기화하는 InitializeComponent() 메소드 호출 

 

 

 

이름을 MainForm으로 변경할때 모든 참조의 이름도 바꿔주지않으면 일일이 다 바꿔줘야하기때문에 왠만하면 '예'를 눌러주자

 

 

보기 -> 도구 상자  를 들어가보면 많은 도구들이 있다.

마우스를 갖다대보면 어떤 도구인지 보여준다

참고로, 삭제하려면 도구를 누르고 Delete키를 누르면 된다.

 

 

 

윈폼 애플리케이션 작성하기

 

디자인

 - 컨트롤

 - 컴포넌트 : 화면에는 나타나지않고 이벤트를 주어야 나타난다(대화상자에있다)

 - 프로퍼티 : F4나 보기->속성창을 눌러본다

 - 이벤트

 

코드

- 멤버

- 이벤트처리기

 

 

 

프로퍼티)

버튼이 있는 상태에서 프로퍼티를 실행하면 속성창에서 버튼1의 속성을 볼 수 있다
속성 창에서는 버튼의 모양, 폰트, 버튼의 이름 등 여러가지의 속성을 설정할 수 있다

 버튼이 만약 수십개라면 botton1이 어떤 버튼인지 구별하기 어렵기때문에 어떻게 사용하는 버튼인지 이름을 잘 정해주는 것이 좋다.

 

레이아웃에서 Btnmessage의 위치를 정확히 좌표로 지정해줄 수도 있다.

 

 

VS에서는 컨트롤 + Shift + S로 전체 저장을 생활화하자

 

windowState는 메인윈도우 화면을 꽉 채우는거랑 중간 크기로 할껀지 조절할 수 있다.

더블클릭은 하지말아야..한다

 

 

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 WinformApp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();    // 디자이너.cs 파일의 메서드인데 매우 중요한 구문임
        }

        private void MainForm_Load(object sender, EventArgs e)
        {

        }
        private void BtnMessage_Click(object sender, EventArgs e)
        { // 클릭했을때 이벤트가 발생하는 메서드
            DateTime now = DateTime.Now;  // 현재 시간을 출력하는 구문
            MessageBox.Show($"Hell World! {now}");   
        }
    }
}

 

Label 추가 - Text 박스 추가

레이블은 화면에 보이기만함(굳이 이름지어줄 필요는 없다) - 줄여서 Lbl

Text 박스는 이름을 지어주자. 줄여서 Txt

버튼은 줄여서 Bin

 

 

 

폼 클래스

- 윈도우 폼을 사용하는 모든 클래스의 베이스 클래스(조상님임)

- 폼의 외형을 설정하는 프로퍼티, 폼의 동작을 정의하는 메서드, 그리고 사용자와 상호작용을 처리하는 이벤트 등이 정의되어 있는 클래스이다.

- System.Windows.Forms 네임스페이스에 포함된다.

 

4.8) 폼 클래스의 베이스 클래스

폼 클래스의 베이스 클래스

 

 

 

폼 클래스의 멤버

InitializeComponent()메서드

 - 폼에 있는 각종 컴포넌트들을 초기화

 - 통합 개발 환경이 관리하는 메서드

 

Form 클래스의 자체 정의 멤버

 

Control 클래스의 멤버

 

 

실시간 현재 시간을 알려주는 시계 만들기)

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 ClockApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            label1.Text = now.ToString("HH:mm:ss");
        }
    }
}

 

 

 

 

폼 로디, 폼 클로즈, 폼 Activated를 사용해보자

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 ClockApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            label1.Text = now.ToString("HH:mm:ss");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("Form 로드시 발생");
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Form 클로즈시 발생");
        }
        private void Form1_Activated(object sender, EventArgs e)
        {
            MessageBox.Show("Form 활성화시 발생");
        }
    }
}

Load, FormClosed, Activated에 더블클릭하고

MessageBox.Show("");  // ("")사이에 각 폼마다 발생을 적어주고 실행하면 각자 맡은 발생구역에서 따로 창이 나타나며 메세지박스가 출력된다.(참고로 Activated는 닫기버튼을 눌러도 창이떠버려서 닫을 수 없으므로 디버깅을 멈추거나 작업 관리자에서 꺼줘야한다)

 

 

 

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 ClockApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            label1.Text = now.ToString("HH:mm:ss");
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("진짜 닫을래?", "경고",
               MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                MessageBox.Show("진짜 닫는구나?");
                e.Cancel = false;  // 취소를 안시켜서 종료(닫기 후, 진짜 닫을래?에서 예를 클릭)
            }
            else
            {
                e.Cancel = true;   // 취소시키니까 종료안됨(닫기 후, 진짜 닫을래?에서 아니오를 클릭)
            }
        }
    }
}

시계창에서 닫기('X'모양)을 클릭하면 경고가 뜬다(오른쪽은 Question을 Warning으로 바꿨을때의 창 변화이다)

참고로 MessageBoxIcon.ㅁㅁㅁㅁ 에서 ㅁㅁㅁㅁ부분에 많은 아이콘이 있으니 참고하도록하자

 

 

 

 

컨트롤 클래스의 프로퍼티

 

커서 프로퍼티

마우스의 커서 모양을 설정하는 프로퍼티이다. Cursor 클래스는 커서를 표현하기 위해서 사용하며 커서 클래스의 프로퍼티는 시스템에서 미리 정의된 커서를 나타낸다.

 

형식)

public Cursor Cursor {get; set;}

 

 

컨트롤 클래스의 주요 메서드

 

컨트롤 클래스의 주요 이벤트

 

 

8장. 컨트롤

버튼 기반 컨트롤

레이블과 링크 레이블

텍스트 상자

리스트

 

컨트롤

화면에 표시되어 사용자와 상호작용을 수행하는 컴포넌트를 의미.

종류 : 버튼, 레이블, 텍스트, 리스트

 

컨트롤의 종류

 

버튼 기반 컨트롤

ButtonBase 추상 클래스를 상속받은 컨트롤을 의미하며, 버튼, 체크 박스, 라디오 버튼이 있다.

 

 

버튼

사용자 입력을 받는 가장 간단한 방법으로, 버튼을 클릭함으로써 이벤트를 발생시킨다.

윈폼에서 파워포인트에서 모양을 복사할때처럼 컨트롤을 드래그하면 복사가된다.(팝업창중에 서식으로 맨앞순서도 바꿀 수 있다)

 

 

 남은 버튼의 내용은 내일부터 하도록하자.. 

 

20/06/16 수정 : 윈폼 예제에 소스코드만 복사해놨는데 이게 다른데서는 실행이 안되는군요 속성창에있는거까지 전부 캡처해서 올리도록 하겠습니다

 

 

===========================================================================

P.S) 커밋에 대해 알아보자

해당 폴더에서 Git 커밋을 클릭해준다
메시지에 메모할 것을 남겨두고, 커밋할 파일들을 체크해주고 커밋을 클릭

 근데 해당 커밋을 할 경우에, 깃허브에 수정이 완료된 상태로 업로드되기때문에 주의해야한다. 나중에 팀원들과 프로젝트를 진행할때 소통을 잘하고 커밋을 하는 것을 생각하자.(해당 이미지는 강사님께서 쓰셨던 예제들이라서 커밋은 하지않고 캡처만 떴습니다)

 

 

 

 

 

 

 

P.S) (2) 새 프로젝트 생성할때

 ClockAp가 굵은 글씨체로 되어있다

반응형