본문 바로가기

Programing(프로그래밍)

C# 직원관리시스템 (파일 입출력, List<T>와 정렬, 클래스란 무엇인가)

직원관리시스템 (Employee Management System)


이거 작성하는데 온종일 퍼부으면서도 3일걸림... 

오늘에서야 괜찮아보인다는 말을 듣고 정리해본다 ㅠㅠ(으어어어)


1. 상식적인 클래스

파칭코 게임 이후에 도형 출력 프로그램 만들면서 

OOP에 대해 배우고 클래스에 대한 개념도 확실히 잡혔겠지!! 하곤 자만했다가

막상 코딩 들어가서 해맨게 한두가지가 아니었다


설명하자면, 일단 아직도 클래스를 섞어서 썼었다.

정보를 다루는 클래스는 정보만 다뤄야 하는데, 받은 정보를 출력한다거나하는 하는 역할의 혼동.

그리고 OOP는 일단 "상식"이 필요한 일이라는걸 알게되었다.

예를들어 말하는 연필을 본적이 있나? 상식적으로 말이 안된다.

근데 코딩을 하다 보면 말하는 연필이 만들어질수도 있다(...)이런걸 조심해야한다.

추상화에 심각하게 어긋나는 방법이다.

매니저 클래스는 매니징만 해야한다. 보려주는건 프로그램 클래스가 해야 한다.

언행일치 하는 클래스와 함수를 만들자.


2. 도스창에서 파일을 만들어봄!!!

처음으로 파일 입출력을 사용해보았다. 사용법은 MSDN[각주:1]나 블로그들[각주:2]에 잘 나와있다.

내 코드중에서 EmployeeManager class가 가지고 있는 SaveToFile()과 LoadFromFile()이 그것.

의외로 함수들을 그냥 가져다 써서인지 어렵지 않았다...허허


3. 리스트(List<T>) 좋아요

직원들의 목록 관리를 위해 List<T>라는걸 처음 써봤다.

Array랑은 뭐가 다를까 두근두근해 하며 써봤는데 결론은 동일 ㅋㅋ...

처음에 리스트는 어떻게 파라미터로 넘겨받는지 몰라 조금 헤매다가 어찌어찌 성공.

다만 Array는 값이 여러개 들어있는거고, List는 그게 한 박스에 담겨있는 형태라고나 할까

char[] Array랑 string의 차이랑 똑같다고 스승님이 말했다.

 

(3일동안 받은 코드 리뷰들....)   


4. 근데 정렬은 뭐가 뭔지 모르겠어요

List 개념이나 사용방법은 Array랑 크게 다르지 않아서 어렵지 않았는데 문제는 List<T>.Sort()....정렬....

그냥 정렬해줘!! 라고 하면 그냥 정렬해줄 줄 알았더니, 뭔가 정렬할때 쓸 함수가 또 필요하댄다...

구글링해가면서 해결방법은 찾았는데 아직도 완전히 이해가 되질 않아서... 내일 다시한번 뜯어봐야겠다.


5.그 외의 자잘하게

- 함수 이름은 기능이기 때문에 동사를 쓴다. 그리고 첫글자를 대문자로 쓰자.(ex. Get, Set, Display...)

- 클래스 이름은 객체를 만드는 도안같은 역할이기때문에 명사를 쓰자 (ex. System, Program....)

- Enum은 첫글자는 대문자를 쓴다. 그리고 클래스처럼 명사를 쓴다.

- 새로만들어진 클래스가 기존 main()이 들어있는 클래스(여기선 Program)를 참조하게 되면

  나중에 확장성에 문제가 생긴다. 이거 말고 다른 프로그램에서 새 클래스를 가져다 쓰게되면 어떡할껀가?

- Input 이라던가, number같은 딱봐서 어디에 쓰일지 모르겠는 이름은 제발 짓지 말자.(흑... 상상력이 부조카다..)

- 필요없는 else는 생략하는게 좋다.

- 초반엔 매니저 클래스를 static으로 만들려고 했는데, 

  그러면 만약 둘 이상의 회사를 관리하게 될때 여러명의 매니저가 불가능해지기 때문에 그냥 일반 함수들로 구현했다.

  이 클래스가 여럿 복제될 일이 있는지 아니면 한 개로 계속 쓰일지 클래스를 디자인할때 미리 생각하라

- 위와 같은 이유로 직원들 리스트는 프로그램이 아닌 오직 매니저만 가지고 있다. 프로그램이 필요하면 매니저꺼 가져다 쓴다.

- 다시한번 강조. 클래스와 함수가 할 일을 확실히 구분하라. 이름을 보고 얘가 무슨 용도인지 한눈에 파악되게.



이제 드디어 코드들.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using System;
using System.Collections.Generic;
 
namespace managementsystem
{
    class Program
    {
        static void Main(string[] args)
        {
            EmployeeManager manager = new EmployeeManager();
 
            while (true)
            {
                Console.Clear();
                Console.WriteLine("::Employee Management System::");
                Console.WriteLine("[1] Input the New Employee");
                Console.WriteLine("[2] Check All Employees");
                Console.WriteLine("[3] Save");
                Console.WriteLine("[4] Load");
                Console.WriteLine("[5] Exit");
 
                MainMenuOption mainmenunumber = (MainMenuOption)Int32.Parse(Console.ReadLine());
 
                switch (mainmenunumber)
                {
                    case MainMenuOption.Newemployee:
                        {
                            Console.Clear();
                            Console.WriteLine("[1] Input the New Employee---");
                            manager.CreateEmployee(InputForm());
                            break;
                        }
                    case MainMenuOption.Check:
                        {
                            bool editpage = true;
                            while (editpage)
                            {
                                Console.Clear();
                                Console.WriteLine("[2] Check All Employees---");
                                DisplayEmployees(manager.Employees);
                                Console.WriteLine("---------END--------");
                                Console.WriteLine("[1] Edit Employee");
                                Console.WriteLine("[2] Delete Employee");
                                Console.WriteLine("[3] Delete All Employees");
                                Console.WriteLine("[4] Sort(Name) Employees");
                                Console.WriteLine("[5] Find Employee by First Name");
                                Console.WriteLine("[6] Back to the Mainpage");
                                Console.WriteLine("[7] Exit");
 
                                EditMenuOption editmenunumber = (EditMenuOption)Int32.Parse(Console.ReadLine());
 
                                switch (editmenunumber)
                                {
                                    case EditMenuOption.Edit:
                                        {
                                            Console.Write("[Edit] which number? : ");
                                            int editnumber = Int32.Parse(Console.ReadLine());
                                            manager.EditEmployee(editnumber, InputForm());
                                            break;
                                        }
                                    case EditMenuOption.Delete:
                                        {
                                            Console.Write("[Delete] which number? : ");
                                            int deletenumber = Int32.Parse(Console.ReadLine());
                                            manager.DeleteEmployee(deletenumber);
                                            break;
                                        }
                                    case EditMenuOption.DeleteAll:
                                        {
                                            Console.Write("[Delete All] Do you want delete all?");
                                            Console.Write(" y / n : ");
                                            string delete = Console.ReadLine();
                                            if (delete == "y")
                                            {
                                                manager.DeleteAllEmployee();
                                            }
                                            break;
                                        }
                                    case EditMenuOption.Sort:
                                        {
                                            manager.Sort();
                                            break;
                                        }
                                    case EditMenuOption.Find:
                                        {
                                            Console.Write("- Name : ");
                                            List<Employee> findresult = manager.FindByName(Console.ReadLine()); 
                                            DisplayEmployees(findresult);
                                            string pause = Console.ReadLine();
                                            break;
                                        }
                                    default:
                                    case EditMenuOption.BackToMain:
                                        {
                                            editpage = false;
                                            break;
                                        }
                                    case EditMenuOption.Exit:
                                        {
                                            return;
                                        }
                                }
                            }
                            break;
                        }
                    case MainMenuOption.Save:
                        {
                            Console.WriteLine("Input File Name : ");
                            string filename = Console.ReadLine();
                            manager.SaveToFile(filename);
                            Console.WriteLine("---Done!---");
                            System.Threading.Thread.Sleep(300);
                            break;
                        }
                    case MainMenuOption.Load:
                        {
                            Console.WriteLine("Input File Name : ");
                            string filename = Console.ReadLine();
                            manager.LoadFromFile(filename);
                            Console.WriteLine("---Done!---");
                            System.Threading.Thread.Sleep(300);
                            break;
                        }
                    default:
                    case MainMenuOption.Exit:
                        return;
                }
            }
        }
 
        public static Employee InputForm()
        {
            Console.Write("- Name : ");
            string name = Console.ReadLine();
            Console.Write("- Department : ");
            string department = Console.ReadLine();
            Console.Write("- Title : ");
            string title = Console.ReadLine();
 
            return new Employee(name, department, title);
        }
 
        public static void DisplayEmployees(List<Employee> Employees)
        {
            int count = 0;
            foreach (Employee e in Employees)
            {
                Console.Write("<{0}> ", count);
                Console.WriteLine(e.GetEmployeeInformation());
                count++;
            }
        }
    }
}
 
cs


1
2
3
4
5
6
7
8
public enum MainMenuOption
{
    Newemployee = 1,
    Check,
    Save,
    Load,
    Exit
}
c  s


1
2
3
4
5
6
7
8
9
10
public enum EditMenuOption
{
    Edit = 1,
    Delete,
    DeleteAll,
    Sort,
    Find,
    BackToMain,
    Exit
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
namespace managementsystem
{
    class Employee
    {
        public string Department { get; private set; }
        public string Name { get; private set; }
        public string Title { get; private set; }
 
        public Employee(string name, string department, string title)
        {
            Name = name;
            Department = department;
            Title = title;
        }
 
        public string GetEmployeeInformation()
        {
            return "-Name: " + Name + " -Department: " + Department + " -Title: " + Title;
        }
 
        public static int compare(Employee a, Employee b)
        {
            return a.Name.CompareTo(b.Name);
        }
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System;
using System.IO;
using System.Collections.Generic;
 
namespace managementsystem
{
    class EmployeeManager
    {
        public List<Employee> Employees = new List<Employee>();
 
        public void CreateEmployee(Employee newEmployee)
        {
            Employees.Add(newEmployee);
        }
 
        public void EditEmployee(int editnumber, Employee newEmployee)
        {
            Employees[editnumber] = newEmployee;
        }
 
        public void DeleteEmployee(int deletenumber)
        {
            Employees.RemoveAt(deletenumber);
        }
 
        public void DeleteAllEmployee()
        {
            Employees.Clear();
        }
 
        public List<Employee> FindByName(string name)
        {
            int count = 0;
            List<Employee> findresult = new List<Employee>();
            foreach (Employee e in Employees)
            {
                if (e.Name == name)
                {
                    findresult.Add(e);
                }
                count++;
            }
            return findresult;
        }
 
        public void Sort()
        {
            Employees.Sort(Employee.compare);
        }
 
        public void SaveToFile(string filename)
        {
            StreamWriter savefile = new StreamWriter(@"C:\temp\" + filename + ".txt");
            foreach (Employee e in Employees)
            {
                savefile.WriteLine(e.Name);
                savefile.WriteLine(e.Department);
                savefile.WriteLine(e.Title);
            }
            savefile.Close();
        }
        public void LoadFromFile(string filename)
        {
            Employees.Clear();
            StreamReader loadfile = new StreamReader(@"C:\temp\"+ filename + ".txt");
            while (loadfile.Peek() >= 0)
            {
                Employees.Add(new Employee(loadfile.ReadLine(), loadfile.ReadLine(), loadfile.ReadLine()));
                // name line, department line, title line.
            }
            loadfile.Close();
        }
    }
}
 
cs











  1. MSDN File 클래스 : https://msdn.microsoft.com/ko-kr/library/system.io.file(v=vs.110).aspx [본문으로]
  2. 엑시노아의 비공정 파일 입출력 : http://exynoa.tistory.com/154 [본문으로]