[문과 코린이의 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("안녕하세요");
}
}
}
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 + "]");
}
}
}
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |