IT 개발노트

직원관리 프로그램 만들기 본문

알고리즘/JAVA

직원관리 프로그램 만들기

limsungju 2019. 3. 4. 13:37

문제
: 당신은 프로그램 개발 회사 CARE AP에서 응용 프로그램 개발을 담당하고 있는 엔지니어이다.
CARE LAB을 운영하는 계열사에서 회사 직원들을 관리하는 직원관리 프로그램의 제작을 의뢰해왔다.
다음 요구 사항에 따라 프로그램을 제작하여라.

관리하려는 항목은 이름, 직급, 기본급, 수당, 세율, 월급이다.
세율은 200만원 이하 : 1%(0.01), 400만원 이하 : 2%(0.02), 400만원 초과 : 3%(0.03)으로 설정한다.
월급은 "기본급 + 수당 - (기본급 + 수당) * 세율"로 계산을 한다.
시작화면으로 메뉴를 보여준다.

각 메뉴의 기능은 다음과 같다.
등록 : 이름, 직급, 기본급, 수당을 입력받는다.
출력 : 모든 직원의 이름, 직급, 기본급, 수당, 세율, 월급을 보여준다.
수정 : 특정 직원의 직급, 기본급, 수당을 입력받아서 수정한다.
검색 : 이름을 입력하면, 그 직원의 이름, 직급, 기본급, 수당, 세율, 월급을 보여준다.
종료 : 프로그램을 종료한다.

위의 내용과 아래의 조건에 맞추어 월급관리 프로그램을 작성하세요.
(CompanyBasics 클래스는 기본 값(이름, 직급, 기본급 등)들의 setter, getter이 있는 클래스이다.)

<조건>
1. 사원 등록 기능을 구현한다. CompanyBasics 객체를 포함시켜 처리한다.
2. 직원 1명의 데이터는 자바빈(CompanyBasics) 객체로 처리한다.
3. 수정하고자 하는 사원이 존재할 경우 수정 가능하게 처리한다.
4. 저장되어 있는 사원들 중 검색하는 사원이 존재하면 내용 출력 처리한다.
5. 종료를 선택하기 전까지는 프로그램이 종료되면 안 된다.
6. 화면 메뉴는 아래를 참조하며, MainClass의 main 메서드에서 동작하게 만든다.

1. 등록
2. 출력
3. 수정
4. 검색
5. 종료

<<소스코드>>

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
package Java.sungju.LimSungJu_CARE;
 
import java.util.Scanner;
 
public class MainClass
{
    public static void main(String[] args)
    {
        // Scanner기능을 사용하기 위해 객체 생성
        Scanner sc = new Scanner(System.in);
        
        // CompanyService 클래스를 사용하기 위해 객체 생성
        CompanyService cs = new CompanyService();
        
        //while문 탈출용도로 사용할 boolean 선언
        boolean bo = true;
        
        // 직원관리 프로그램을 종료전까지 반복 동작 시키기 위해 while문 사용
        while(bo)
        {
            System.out.println("1. 등록");
            System.out.println("2. 출력");
            System.out.println("3. 수정");
            System.out.println("4. 검색");
            System.out.println("5. 종료");
            System.out.print(">>> ");
            
            // switch-case문을 사용하기 위해 key값 입력받기
            int key = sc.nextInt();
            
            // 원하는 case문을 사용하기 위해 입력받은 key값 넣어주기
            switch(key)
            {
            case 1// 등록
                cs.saveWorker();
                break;
                
            case 2// 출력
                cs.outpub();
                break;
                
            case 3// 수정
                cs.modify();
                break;
                
            case 4// 검색
                cs.search();
                break;
                
            case 5// 종료
                System.out.println("프로그램 종료");
                bo = false;
                break;
            }
        }
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Java.sungju.LimSungJu_CARE;
 
public interface Company 
{
    //입력
    public void saveWorker();    // 직원 한명의 값 전달 메서드
    
    //연산
    public void modify();    // 특정 직원의 직급, 기본급, 수당 수정 메서드
    public void search();    // 이름 값으로 해당 값을 가진 직원 찾기 & 해당 값 출력 메서드
    
    //출력
    public void outputTitle();    // 출력되는 정보들의 타이틀 출력 메서드
    public void outpub();    // 모든 직원의 정보 출력 메서드
}


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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
package Java.sungju.LimSungJu_CARE;
 
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
 
public class CompanyService implements Company
{
    // Scanner기능을 사용하기 위해 객체 생성
    Scanner sc = new Scanner(System.in);
 
    // CompanyBasics 클래스를 사용하기 위해 객체 생성
    CompanyBasics cb = new CompanyBasics();
 
    // CompanyBasics객체만 담을 수 있는 ArrayList 생성
    ArrayList<CompanyBasics> csarr = new ArrayList<CompanyBasics>();
 
    // 직원 한명의 값 전달 메서드
    @Override
    public void saveWorker()
    {
        // savaWorker메서드 안에서 새로 생성해주지 않으면 ArrayList에 넣어줄때
        // 모든값이 마지막에 입력한 값으로 일괄변경 되기 때문에 생성해준다.
        CompanyBasics cb = new CompanyBasics();
 
        // 입력받는 타입이 다르면 예외처리를 해주기위해 try-catch문 사용
        try 
        {
            System.out.print("등록할 직원의 이름을 입력하세요 : ");
            // Scanner로 입력받은 값을 setName메서드를 이용해서 넣어주기
            String name = sc.next();
            cb.setName(name);
            System.out.print("등록할 직원의 직급을 입력하세요 : ");
            // Scanner로 입력받은 값을 setRank메서드를 이용해서 넣어주기
            String rank = sc.next();
            cb.setRank(rank);
 
        }
        catch (InputMismatchException e) 
        {
            System.out.println("문자를 입력하세요.");
            // 잘못입력된 값 비워주기
            sc.nextLine();
        }
 
        try 
        {
            System.out.print("등록할 직원의 기본급을 입력하세요(만원) : ");
            // Scanner로 입력받은 값을 setNormal메서드를 이용해서 넣어주기
            int normal = sc.nextInt();
            cb.setNormal(normal);
            System.out.print("등록할 직원의 수당을 입력하세요(만원) : ");
            // Scanner로 입력받은 값을 setExtrapay메서드를 이용해서 넣어주기
            int extrapay = sc.nextInt();
            cb.setExtrapay(extrapay);
 
            // Scanner로 입력받은 Normal, Extrapay값을 이용해서 Tariff값 넣어주기
            if ((cb.getNormal() + cb.getExtrapay()) <= 200
            {
                cb.setTariff(0.01);
            }
            else if ((cb.getNormal() + cb.getExtrapay()) <= 400
            {
                cb.setTariff(0.02);
            } 
            else if ((cb.getNormal() + cb.getExtrapay()) > 400)
            {
                cb.setTariff(0.03);
            }
 
            // Normal, Extrapay, Tariff값을 이용해서 Salary값 넣어주기
            cb.setSalary(
                    (cb.getNormal() + cb.getExtrapay()) - (((cb.getNormal() + cb.getExtrapay()) * cb.getTariff())));
 
            // 설정한 값들이 저장된 CompanyBasics객체를 ArrayList에 저장
            csarr.add(cb);
        }
        catch (InputMismatchException e)
        {
            sc.nextLine();
            System.out.println("숫자를 입력하세요.");
        }
 
    }
 
    // 특정 직원의 직급, 기본급, 수당 수정 메서드
    @Override
    public void modify() 
    {
        try
        {
            if (csarr.size() == 0)
            {
                throw new IndexOutOfBoundsException("저장되있는 직원 정보가 없습니다.");
            }
            // 모든 직원들의 정보를 보여주기 위해 outpub메서드 호출
            outpub();
 
            try 
            {
                System.out.print("수정할 직원의 입사번호를 입력하세요 : ");
                // 수정할 직원의 입사번째 번호를 입력
                int i = sc.nextInt();
 
                // ArrayList는 0번째 방부터 저장되기 때문에 입력한 값에서 1을 빼서 저장
                i = i - 1;
 
                // 입력한 입사자의 정보를 ArrayList에서 삭제
                csarr.remove(i);
 
                System.out.print("수정할 직원의 이름을 입력하세요 :");
                // Scanner로 입력받은 값을 setName메서드를 이용해서 넣어주기
                cb.setName(sc.next());
                System.out.print("직원의 직급을 수정하세요 : ");
                // Scanner로 입력받은 값을 setRank메서드를 이용해서 넣어주기
                cb.setRank(sc.next());
                System.out.print("직원의 기본급을 수정하세요 : ");
                // Scanner로 입력받은 값을 setNormal메서드를 이용해서 넣어주기
                cb.setNormal(sc.nextInt());
                System.out.print("직원의 수당을 수정하세요 : ");
                // Scanner로 입력받은 값을 setExtrapay메서드를 이용해서 넣어주기
                cb.setExtrapay(sc.nextInt());
 
                if ((cb.getNormal() + cb.getExtrapay()) <= 200
                {
                    cb.setTariff(0.01);
                } 
                else if ((cb.getNormal() + cb.getExtrapay()) <= 400)
                {
                    cb.setTariff(0.02);
                } 
                else if ((cb.getNormal() + cb.getExtrapay()) > 400
                {
                    cb.setTariff(0.03);
                }
 
                // Normal, Extrapay, Tariff값을 이용해서 Salary값 넣어주기
                cb.setSalary(
                        (cb.getNormal() + cb.getExtrapay()) - (((cb.getNormal() + cb.getExtrapay()) * cb.getTariff())));
 
                // 새로 입력받은 직원의 정보를 삭제한 자리에 저장
                csarr.add(i, cb);
            } 
            catch (InputMismatchException e)
            {
                sc.nextLine();
                System.out.println("숫자를 입력하세요.");
            }
        } 
        catch (IndexOutOfBoundsException e)
        {
            System.out.println(e.getMessage());
        }
    }
 
    // 이름 값으로 해당 값을 가진 직원 찾기 & 해당 값 출력 메서드
    @Override
    public void search() 
    {
        try 
        {
            if (csarr.size() == 0)
            {
                throw new IndexOutOfBoundsException("저장되있는 직원 정보가 없습니다.");
            }
 
            try
            {
                System.out.print("찾으려는 직원의 이름을 입력하세요 : ");
                // 찾으려는 직원의 이름을 입력받고 name2에 저장
                String name2 = sc.next();
 
                for (int i = 0; i < csarr.size(); i++
                {
                    // ArrayList에 저장되있는 값들의 Name을 불러오기
                    cb = csarr.get(i);
                    cb.getName();
 
                    // ArrayList의 Name과 입력한 Name2가 같으면
                    // 그 Name의 정보를 모두 출력
                    if (name2.equals(cb.getName())) 
                    {
                        outputTitle();
                        System.out.println(csarr.get(i));
                    }
                }
            } 
            catch (InputMismatchException e) 
            {
                sc.nextLine();
                System.out.println("문자를 입력하세요.");
            }
        } 
        catch (IndexOutOfBoundsException e)
        {
            System.out.println(e.getMessage());
        }
 
    }
 
    // 출력되는 정보들의 타이틀 출력 메서드
    @Override
    public void outputTitle() 
    {
        System.out.println("이름\t직급\t기본급\t수당\t세율\t월급");
    }
 
    // 모든 직원의 정보 출력 메서드
    @Override
    public void outpub() 
    {
        int cnt = 1;
        try
        {
            if (csarr.size() == 0
            {
                throw new IndexOutOfBoundsException("저장되있는 직원 정보가 없습니다.");
            }
            for (int i = 0; i < csarr.size(); i++
            {
 
                System.out.print(cnt + "번째 입사자 ");
 
                // ArrayList에 저장된 모든 객체 출력해서 보여주기
                System.out.println(csarr.get(i));
                cnt = cnt + 1;
            }
        } 
        catch (IndexOutOfBoundsException e)
        {
            System.out.println(e.getMessage());
        }
    }
}


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
package Java.sungju.LimSungJu_CARE;
 
public class CompanyBasics 
{
    private String name, rank; // 이름, 직급
    private int normal, extrapay; // 기본급, 수당
    private double tariff, salary; // 세율, 월급
    
    public String getName() {    // 이름 받아오기
        return name;
    }
    public void setName(String name) {    // 이름 지정하기
        this.name = name;
    }
    public String getRank() {    // 직급 받아오기
        return rank;
    }
    public void setRank(String rank) {    // 직급 지정하기
        this.rank = rank;
    }
    public int getNormal() {    // 기본급 받아오기
        return normal;
    }
    public void setNormal(int normal) {    // 기본급 지정하기
        this.normal = normal;
    }
    public int getExtrapay() {    // 수당 받아오기
        return extrapay;
    }
    public void setExtrapay(int extrapay) {    // 수당 지정하기
        this.extrapay = extrapay;
    }
    public double getTariff() {    // 세율 받아오기
        return tariff;
    }
    public void setTariff(double tariff) {    // 세율 지정하기
        this.tariff = tariff;
    }
    public double getSalary() {    // 월급 받아오기
        return salary;
    }
    public void setSalary(double salary) {    // 월급 지정하기
        this.salary = salary;
    }
    
    
    // toString을 오버라이드 해주지 않으면
    // 저장된 객체의 주소가 출력된다.
    @Override
    public String toString() 
    {
        return "이름 : " + this.getName() +
                ", 직급 : " + this.getRank() +
                ", 기본급 : " + this.getNormal() + "만원" +
                ", 수당 : " + this.getExtrapay() + "만원" +
                ", 세율 : " + (int)(this.getTariff()*100+ "%" +
                ", 월급 : " + this.getSalary() +"만원"
    }
}


고민했던 점
- ArrayList에 대한 이해도가 부족해서 입력한 이름만 출력하는데 어려움이 있었지만, ArrayList가 저장하고 있는 객체들을 모두 호출한다음에 getter메서드를 이용해서 원하는 값이 있는 객체와 입력한 값을 비교하는 방법을 사용하면 된다는 것을 알고 해결했다.