본문 바로가기

문과 코린이의, [C#] 기록/C# 활용

[문과 코린이의 IT 기록장] C# 활용 -Windows From 기초 & 학생관리 클래스 모델링 실습

반응형

[문과 코린이의 IT 기록장] C# 활용 -Windows From 기초 & 학생관리 클래스 모델링 실습

[문과 코린이의 IT 기록장] C# 활용 -Windows From 기초 & 학생관리 클래스 모델링 실습

 


0. Windows Forms 앱 (.Net Framework) 만들기 기초

- 이 폼은, PPT 등을 만들 때 사용되는 것

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // static Main 메서드는, 명령만 하고 구체적 활동은 하지 않음.
            // 실전에서 프로그램 코드는 이러한 식으로 작성됨.

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); // 파라미터로 Form1이라는 클래스를 줌
            // 그러면 모든 제어가 Form1이 가져감. 꺼지면 사라짐.
        }
    }
}
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 WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("안녕하세요");
        }
    }
}

F5 - 실행 폼 생성
button에 대한 property(속성)

 


1. Student Class 설계 

1. 대표명사 추출

2. 명사 추출 -> Property로 쓰일 후보들

3. 동사 추출 -> Method로 쓰일 후보들

 

1.

- 중학교입니다 // 중학교 

- 1학년부터 3학년까지 있습니다. // 학년(1-3)

- 각 학년은 10반까지 구성됩니다. // 반(1-10)

- 한 반의 학생은 50명 입니다. // 반(50명/반)

- 학생들은 이름, 주소, 전화번호, 키, 몸무게, 나이, 성별 정보를 갖습니다. 그리고 반별로 학생 고유번호를 부여합니다.

// 학생(이름, 주소, 전화번호, 키, 몸무게, 나이, 성별, 고유번호[반별])

- 학생들은 국어만 배웁니다. 시험은 학기별 중간고사, 기말고사를 치룹니다.

// 배운다.

// 시험 (중간고사, 기말고사) [학기별]

// 학기 (상반기, 하반기)

// 과목(국어)

// 치룹니다. => [결과] 성적

 

2. 

- 중학교입니다 # 프로젝트명

- 1학년부터 3학년까지 있습니다.

- 각 학년은 10반까지 구성됩니다. 

- 한 반의 학생은 50명 입니다. 

- 학생들은 이름, 주소, 전화번호, 키, 몸무게, 나이, 성별 정보를 갖습니다. 그리고 반별로 학생 고유번호를 부여합니다.

- 학생들은 국어만 배웁니다. 시험은 학기별 중간고사, 기말고사를 치룹니다.

// 학생(이름, 주소, 전화번호, 키, 몸무게, 나이, 성별, 고유번호[반별]), 학년(1-3), 반(1-10반, 50명/반), 시험(중간고사, 기말고사, 상반기,하반기)

// 과목(국어)

// 배운다.

// 치룹니다. => [결과] 성적

 

3. 

 

 

4. 

프로젝트명 : 중학교 학사관리

학생(학년, 반, 고유번호[반별], 이름, 주소, 전화번호, 키, 몸무게, 나이, 성별, 시험(중간고사/기말고사, 상반기/하반기)

// 학생 한명한명을 식별하기 위한 식별자를 지정한다. 즉, 학생에 대한 식별자(DB에서 Primary Key)를 뽑아낸다.

 * 식별자 : 학년 + 반 + 고유번호 // 이친구들은 절대 없으면 안되는 정보들

 - 이름 : 중복성 가능

 - 전화번호 : 안가지고 있는 사람은 고려할 수 없음 (null값)

 - 고유 번호 : 반마다 번호를 가지고 있음. 다른 반에서는 중복성 가능.

과목(국어, 수학, 영어,....) // 확장성 고려

 


2. Student Class 코드

[ Program.cs ]

using System;

namespace StudentManagement // namespace : 하나의 건물
{
    class Program // class : 여러개의 방
    {
        static void Main(string[] args)
        {
            StudentMgr sm = new StudentMgr(); // 인스턴스 생성 (힙 메모리에 생성)
            sm.Run(); // 프로그램 시작
        }
    }

}

[ StduentMgr.cs ]

using System;
using System.Collections.Generic;
using System.Text;

namespace StudentManagement
{
    public class StudentMgr // StudentMgr라는 인스턴스를 무한대로 만들어 사용 가능함. 
    {
        public void Run() // 프로그램 시작 대표 메서드
        {
            // 1. 프로퍼티로 주는 방법
            /* Student st1 = new Student();
             // enum으로 도메인으로 지정해놓고 사용하는 방법
             st1.stsex = Sex.남성;
             st1.StGrade = Grade.학년_1;
             st1.StClass = StudentClass.반_1;
             st1.StNumber = 1;*/

            // 2. 프로퍼티로 주지 않는 방법 : 생성자로 주는 방법
            // not null, primary key에 해당하는 것들은, 생성자를 만들 적에 강요를 시켜버리는 방법을 사용
            // Student st1 = new Student(Grade.학년_1, StudentClass.반_1, 1, "홍길동"); 


            // ctrl+. : 아직 만들어지지 않은 메서드를 만들어줄 수 있도록 도움
            Student st = RegistStudent();

            // 출력
            st.PrintMe();
        }

        private Student RegistStudent()
        {
            // 콘솔로부터, 학생 등록 프로그램을 개발
            Console.WriteLine("학년 [숫자만 입력] : ");
            string grade = Console.ReadLine(); // 콘솔에서 한 라인을 읽어오기 (엔터값 전까지)

            Console.WriteLine("반 : ");
            string stclass = Console.ReadLine();

            Console.WriteLine("번호 : ");
            string stnumber = Console.ReadLine();

            Console.WriteLine("이름 : ");
            string stname = Console.ReadLine();


            // 해당 값 생성자 등록
            Student st = new Student(
                // 1. 학년
                (Grade)Enum.Parse(typeof(Grade), grade),
                // 입력한 grade 값이 매치되는, Grade의 enum 타입은 무엇인지 찾기.
                
                // 2. 반
                (StudentClass)Enum.Parse(typeof(StudentClass), stclass),

                
                // 3. 번호
                Convert.ToInt32(stnumber),
                // 번호는 int지만, console에서 읽어들이면 모두 string으로 입력받음.

                // 4. 이름
                stname
                );

            return st;
            // 반환값 : Student 객체
        }


    }
}

[ enums.cs ]

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

namespace StudentManagement
{
    // 우리가 프로그램을 짜면, enum은 그 namespace 전번에 걸쳐, 다 공용이 됨.
    // 따라서 무조건 public으로 선언해야함
    public enum Sex // 성 구분을 하는 도메인 지정
    {
        남성, 여성, 미확인
    }

    public enum Grade
    {
        // enum(외에 우리가 지정하는 것들은), 숫자로 시작할 수 없음.
        // 즉 1학년, 2학년, ... 등으로 만들 수 없다.
        학년_1 = 1, 학년_2 = 2, 학년_3 = 3
        // 숫자와 매칭되는 값을 부여하도록 유도 (0부터 시작하면 문제 발생)
    }

    public enum StudentClass // enum에서는 약어를 쓰면 안됨. 이름만 보고 바로 무슨 뜻인지 알아야함.
    {
        반_1 = 1, 반_2 = 2, 반_3 = 3, 반_4 = 4, 반_5 = 5, 반_6 = 6, 반_7 = 7, 반_8 = 8, 반_9 = 9, 반_10 = 10
    }

    // 번호와 같이 변동성이 있다고 판단되는 것들은, enum 말고 int로 냅두는게 더 좋음
    // ex. 50명인 반에서, 갑자기 전학생이 오면 51명이 될 수 있음.
}

[ Student.cs ] 

using System;
using System.Collections.Generic;
using System.Text;

namespace StudentManagement
{
    public class Student
    {
        // 1. 필드, 프로퍼티
        /* 학생 속성들 정의 */
        // 식별자 (PK)
        public Grade StGrade { get; set; } // 학년 
        public StudentClass StClass { get; set; } // 반
        public int StNumber { get; set; } // 학생 고유번호

        public string Name { get; set; } // 이름 (Not Null)
        public string address { get; set; } // 주소
        public int telNumber { get; set; } // 전화번호
        public int height { get; set; } // 키
        public int weight { get; set; } // 몸무게
        public int age { get; set; } // 나이
        public Sex stsex { get; set; } // 성별 (enum Sex 참조)
        public int exam { get; set; } // 시험
        public string subject { get; set; } // 과목


        // 2. 생성자
        // 생성자 기법 : Not Null 및 Primary Key 경우에는, 이를 강요해야 함. 이를 받아들이지 않고는 인스턴스를 만들어주지 않겠다고, 생성자로 강요해야 함.

        public Student(Grade StGrade, StudentClass StClass, int StNumber, string Name, Sex sex)
        {
            this.StGrade = StGrade;
            this.StClass = StClass;
            this.StNumber = StNumber;
            this.Name = Name;
        } 

        public Student(Grade StGrade, StudentClass StClass, int StNumber, string Name) : this(StGrade, StClass, StNumber, Name, Sex.미확인)
        // 자신의 생성자를 부르는데(this), 파라미터가 앞의 5개인 생성자에, 마지막 값에는 null값을 전달하여 호출한다.
        // Sex의 enum값이 null값을 가질 수 없음. 따라서 enum으로 가서, 새로운 미확인 값을 지정해줌,
        { }    
   


        // 3. 메서드
        public void PrintMe()
        {
            // 학생의 학년, 반, 번호, 이름을 출력해줌.
            Console.WriteLine(StGrade + ":" + StClass + ":" + StNumber + "[" + Name + "]");
        }

    }
}

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)

 

반응형