본문 바로가기

Language/Java

[JAVA]급여관리 프로그램

// 근로자 클래스

package Data;


public class Employee {

	private String id;
	private String pw;
	private String name;
	private int sal;
	
	public Employee() {
		
		this.sal = 200;
		
	}

	public String getid() {
		return id;
	}

	public void setid(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getSal() {
		return sal;
	}

	public void setSal(int sal) {
		this.sal = sal;
	}

}

 

// 정규직 클래스

package Data;

public class Permanent extends Employee {

	private String dept;
	private String empNo;
	private float bonus;
	private String position;

	public Permanent() {

		this.bonus = 0;

	}

	public String getEmpNo() {
		return empNo;
	}

	public void setEmpNo(String empNo) {
		this.empNo = empNo;
	}

	public String getDept() {
		return dept;
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	public float getBonus() {
		return bonus;
	}

	public void setBonus(String position) {

		switch (position) {

		case "부장":
			this.bonus = 3.0f;
			break;
		case "과장":
			this.bonus = 2.5f;
			break;
		case "대리":
			this.bonus = 2.0f;
			break;
		case "사원":
			this.bonus = 1.5f;
			break;

		}

	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}

}

 

// 비정규직 클래스

package Data;

public class Irregular extends Employee {

	private int extraSal;

	public int getExtraSal() {
		return extraSal;
	}

	public void setExtraSal(int extraSal) {
		
		this.extraSal = extraSal;
		
	}

}

 

// 시간제 클래스

package Data;

public class PartTime extends Irregular {

	private int workTime;

	public int getWorkTime() {
		return workTime;
	}

	public void setWorkTime(int workTime) {
		this.workTime = workTime;
	}

}

 

// 기간제 클래스

package Data;

public class FixedTerm extends Irregular {

	private int workDate;

	public int getWorkDate() {
		return workDate;
	}

	public void setWorkDate(int workDate) {
		this.workDate = workDate;
	}

}

 

// 관리 클래스

import Data.FixedTerm;
import Data.PartTime;
import Data.Permanent;

public class EmployeeManage {

	private Permanent[] per;
	private PartTime[] pt;
	private FixedTerm[] ft;
	private int perCnt;
	private int ptCnt;
	private int ftCnt;

	public EmployeeManage() {

		this.per = new Permanent[100];
		this.pt = new PartTime[50];
		this.ft = new FixedTerm[50];

		// 근무 형태 별 근무자 수
		this.perCnt = 0;
		this.ptCnt = 0;
		this.ftCnt = 0;

	}

	public Permanent[] getPer() {
		return per;
	}

	// setPer 오버로딩
	public void setPer(Permanent[] per) {
		this.per = per;
	}

	public void setPer(Permanent per) {

		this.per[perCnt++] = per;

	}

	public void setPer(String id, String pw, String name, String dept, String empNo, String position) {

		this.per[perCnt++] = newPermanent(id, pw, name, dept, empNo, position);

	}

	// 신규 정규직 
	public Permanent newPermanent(String id, String pw, String name, String dept, String empNo, String position) {

		Permanent per = new Permanent();

		per.setid(id);
		per.setPw(pw);
		per.setName(name);
		per.setDept(dept);
		per.setEmpNo(empNo);
		per.setPosition(position);
		per.setBonus(per.getPosition());

		return per;

	}

	// 관리자
	public void setManager(Permanent manager) {

		per[perCnt++] = manager;

	}

	public Permanent getManager(int index) {

		return this.per[index];
	}
	//

	public PartTime[] getPt() {
		return pt;
	}

	// setPt 오버로딩
	public void setPt(PartTime[] pt) {
		this.pt = pt;
	}

	public void setPt(PartTime pt) {

		this.pt[ptCnt++] = pt;

	}

	public void setPt(String id, String pw, String name, int workTime) {

	}
	
	// 신규 시간제
	public PartTime newPartTime(String id, String pw, String name, int workTime) {
		
		PartTime pt = new PartTime();
		
		pt.setName(name);
		pt.setid(id);
		pt.setPw(pw);
		pt.setWorkTime(workTime);
		pt.setExtraSal(pt.getWorkTime()/5);
		
		return pt;
		
	}

	public FixedTerm[] getFt() {
		return ft;
	}

	// setFt 오버로딩
	public void setFt(FixedTerm[] ft) {
		this.ft = ft;
	}

	public void setFt(String id, String pw, String name, int workDate) {

		this.ft[ftCnt++] = newFixedTerm(id, pw, name, workDate);

	}

	// 신규 기간제
	public FixedTerm newFixedTerm(String id, String pw, String name, int workDate) {

		FixedTerm ft = new FixedTerm();

		ft.setid(id);
		ft.setPw(pw);
		ft.setName(name);
		ft.setWorkDate(workDate);
		ft.setExtraSal((ft.getWorkDate()/30)*10);

		return ft;

	}

	public void setFt(FixedTerm ft) {
		this.ft[ftCnt++] = ft;
	}

	public int[] getEmpCnt() {

		int empCnt[] = { perCnt, ptCnt, ftCnt };

		return empCnt;

	}
	
	public void setPerCnt(int perCnt) {
		
		this.perCnt = perCnt;
		
	}
	
	public void setFtCnt(int ftCnt) {
		
		this.ftCnt = ftCnt;
		
	}
	
	public void setPtCnt(int ptCnt) {
		
		this.ptCnt = ptCnt;
		
	}

}

 

// 메인 클래스

import java.util.Scanner;

import Data.FixedTerm;
import Data.PartTime;
import Data.Permanent;

public class EmployeeMain {

	private EmployeeManage em;
	private Permanent manager;

	public EmployeeMain() {

		this.em = new EmployeeManage();
		manager = new Permanent();
		setManager();
		setGeneral();

	}

	public EmployeeManage getEm() {

		return em;

	}

	public void setEm(EmployeeManage em) {

		this.em = em;

	}

	// 관리자
	public void setManager() {

		this.manager.setid("m000");
		this.manager.setName("manager");
		this.manager.setPw("m1234");
		this.manager.setDept("인사");
		this.manager.setEmpNo("P001");
		this.manager.setPosition("부장");
		this.manager.setBonus(this.manager.getPosition());
		getEm().setManager(this.manager);

	}
	
	// 평사원
	public void setGeneral() {
		
		getEm().setFt("f001", "f1234", "f001", 25);
		
	}

	public Permanent getManager() {

		return getEm().getManager(0);

	}

	// 사원 추가
	static void insertEmp(EmployeeMain emain) {

		Scanner sc = new Scanner(System.in);
		System.out.println("사원 추가");
		System.out.print("고용 형태를 선택하세요. 1. 정규직 / 2. 기간제 비정규직 / 3. 시간제 비정규직 : ");
		
		String id = "";
		String pw = "";
		String name = "";

		int empType = sc.nextInt();

		switch (empType) {

		// 정규직
		case 1:

			String dept = "";
			String empNo = "";
			String position = "";

			System.out.print("아이디를 입력하세요. : ");
			id = sc.next();
			System.out.print("비밀번호를 입력하세요. : ");
			pw = sc.next();
			System.out.print("이름을 입력하세요. : ");
			name = sc.next();
			System.out.print("부서를 입력하세요.(기획/개발/영업/인사) : ");
			dept = sc.next();
			System.out.print("사번을 입력하세요. : ");
			empNo = sc.next();
			System.out.print("직급을 입력하세요. : ");
			position = sc.next();

			emain.getEm().setPer(id, pw, name, dept, empNo, position);

			break;
			
		// 시간제
		case 2:
			
			int workDate = 0;

			System.out.print("아이디를 입력하세요. : ");
			id = sc.next();
			System.out.print("비밀번호를 입력하세요. : ");
			pw = sc.next();
			System.out.print("이름을 입력하세요. : ");
			name = sc.next();
			System.out.print("근무 일수를 입력해주세요. : ");
			workDate = sc.nextInt();
			
			emain.getEm().setFt(id, pw, name, workDate);
			
			break;
			
		// 기간제
		case 3:
			
			int workTime = 0;

			System.out.print("아이디를 입력하세요. : ");
			id = sc.next();
			System.out.print("비밀번호를 입력하세요. : ");
			pw = sc.next();
			System.out.print("이름을 입력하세요. : ");
			name = sc.next();
			System.out.print("근무 시간 입력해주세요. : ");
			workTime = sc.nextInt();
			
			emain.getEm().setPt(id, pw, name, workTime);
			
			break;

		}

	}

	// 사원 수정
	static void modEmp(EmployeeMain emain) {

		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();
		
		int empCnt[] = emain.getEm().getEmpCnt();
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("수정하고 싶은 아이디를 입력해주세요. : ");
		String id = sc.next();
		
		boolean nonResult = false;
		
		// 정규직
		for (int i = 0; i < empCnt[0]; i++) {
			
			if (per[i].getid().equals(id)) {
				
				Permanent p = per[i];
				
				// 이름 부서 직급만 수정 가능
				System.out.print("수정할 정보를 선택해주세요.(1. 이름 / 2. 부서 / 3. 직급) : ");
				
				switch(sc.nextInt()) {
				
				case 1:
					System.out.print("수정할 이름을 입력해주세요. : ");
					p.setName(sc.next());
					break;
				case 2:
					System.out.print("수정할 부서를 입력해주세요. : ");
					p.setDept(sc.next());
					break;
				case 3:
					System.out.print("수정할 직급을 입력해주세요. : ");
					p.setPosition(sc.next());
					p.setBonus(p.getPosition());
					break;
				
				}
				
				per[i] = p;
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 시간제
		for(int i = 0; i < empCnt[1]; i++) {
			
			if(pt[i].getid().equals(id)) {
				
				PartTime p = pt[i];
				
				// 이름 근무 시간만 수정 가능
				System.out.print("수정할 정보를 선택해주세요.(1. 이름 / 2. 근무 시간) : ");
				
				switch(sc.nextInt()) {
				
				case 1:
					System.out.print("수정할 이름을 입력해주세요. : ");
					p.setName(sc.next());
					break;
				case 2:
					System.out.print("근무 시간을 변경해주세요. : ");
					p.setWorkTime(sc.nextInt());
					p.setExtraSal(p.getWorkTime());
					break;
				
				}
				
				pt[i] = p;
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 기간제
		for(int i = 0; i < empCnt[2]; i++) {
			
			if(ft[i].getid().equals(id)) {
				
				FixedTerm f = ft[i];
				
				// 이름 근무 기간만 수정 가능
				System.out.print("수정할 정보를 선택해주세요.(1. 이름 / 2. 근무 기간) : ");
				
				switch(sc.nextInt()) {
				
				case 1:
					System.out.print("수정할 이름을 입력해주세요. : ");
					f.setName(sc.next());
					break;
				case 2:
					System.out.print("근무 기간을 변경해주세요. : ");
					f.setWorkDate(sc.nextInt());
					f.setExtraSal(f.getWorkDate());
					break;
				
				}
				
				ft[i] = f;
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		if(nonResult) {
			
			System.out.println("검색된 결과가 없습니다. \n아이디를 확인해주세요.");
			
		}

	}

	// 삭제
	static void delEmp(EmployeeMain emain) {

		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();
		
		int empCnt[] = emain.getEm().getEmpCnt();
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("삭제하고싶은 아이디를 입력해주세요. : ");
		String id = sc.next();
		
		boolean nonResult = false;
		
		// 정규직
		for (int i = 0; i < empCnt[0]; i++) {
			
			if (per[i].getid().equals(id)) {
				
				per[i] = per[i++];
				
				emain.getEm().setPerCnt(--empCnt[0]);
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 시간제
		for(int i = 0; i < empCnt[1]; i++) {
			
			if(pt[i].getid().equals(id)) {
				
				pt[i] = pt[i++];
				
				emain.getEm().setPtCnt(--empCnt[1]);
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 기간제
		for(int i = 0; i < empCnt[2]; i++) {
			
			if(ft[i].getid().equals(id)) {
				
				ft[i] = ft[i++];
				
				emain.getEm().setFtCnt(--empCnt[2]);
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		if(nonResult) {
			
			System.out.println("검색된 결과가 없습니다. \n아이디를 확인해주세요.");
			
		}

	}

	// 원하는 아이디로 검색
	static void searchEmp(EmployeeMain emain) {

		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();
		
		int empCnt[] = emain.getEm().getEmpCnt();
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("찾고싶은 아이디를 입력해주세요. : ");
		String id = sc.next();
		
		boolean nonResult = false;
		
		// 정규직
		for (int i = 0; i < empCnt[0]; i++) {
			
			if (per[i].getid().equals(id)) {
				
				System.out.println("아이디 : " + per[i].getid() 
						+ " 이름 :  " + per[i].getName() 
						+ " 부서 :  " + per[i].getDept() 
						+ " 사번 :  " + per[i].getEmpNo() 
						+ " 급여 :  " + (per[i].getSal() * per[i].getBonus())
						+ " 직급 :  " + per[i].getPosition());
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 시간제
		for(int i = 0; i < empCnt[1]; i++) {
			
			if(pt[i].getid().equals(id)) {
				
				System.out.println("아이디 :  " + pt[i].getid() 
						+ " 이름 :  " + pt[i].getName() 
						+ " 근무 시간 :  " + pt[i].getWorkTime() 
						+ " 급여 :  " + (pt[i].getSal() * pt[i].getExtraSal()));
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		// 기간제
		for(int i = 0; i < empCnt[2]; i++) {
			
			if(ft[i].getid().equals(id)) {
				
				System.out.println("아이디 :  " + ft[i].getid() 
						+ " 이름 :  " + ft[i].getName() 
						+ " 근무 일자 :  " + ft[i].getWorkDate() 
						+ " 급여 :  " + (ft[i].getSal() + ft[i].getExtraSal()));
				
				nonResult = false;
				
			} else {
				
				nonResult = true;
				
			}
			
		}
		
		if(nonResult) {
			
			System.out.println("검색된 결과가 없습니다. \n아이디를 확인해주세요.");
			
		}
		
	}
	
	// 본인 정보 검색
	static void searchEmp(EmployeeMain emain, String id) {

		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();
		
		int empCnt[] = emain.getEm().getEmpCnt();
		
		Scanner sc = new Scanner(System.in);

		// 정규직
		for (int i = 0; i < empCnt[0]; i++) {
			
			if (per[i].getid().equals(id)) {
				
				System.out.println("아이디 : " + per[i].getid() 
						+ " 이름 :  " + per[i].getName() 
						+ " 부서 :  " + per[i].getDept() 
						+ " 사번 :  " + per[i].getEmpNo() 
						+ " 급여 :  " + (per[i].getSal() * per[i].getBonus())
						+ " 직급 :  " + per[i].getPosition());
				
			} 
				
		}
		
		// 시간제
		for(int i = 0; i < empCnt[1]; i++) {
			
			if(pt[i].getid().equals(id)) {
				
				System.out.println("아이디 :  " + pt[i].getid() 
						+ " 이름 :  " + pt[i].getName() 
						+ " 근무 시간 :  " + pt[i].getWorkTime() 
						+ " 급여 :  " + (pt[i].getSal() * pt[i].getExtraSal()));
				
			} 
			
		}
		
		// 기간제
		for(int i = 0; i < empCnt[2]; i++) {
			
			if(ft[i].getid().equals(id)) {
				
				System.out.println("아이디 :  " + ft[i].getid() 
						+ " 이름 :  " + ft[i].getName() 
						+ " 근무 일자 :  " + ft[i].getWorkDate() 
						+ " 급여 :  " + (ft[i].getSal() + ft[i].getExtraSal()));
				
			} 
			
		}
	}

	// 전체 조회
	static void allEmp(EmployeeMain emain) {
		
		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();
		
		int empCnt[] = emain.getEm().getEmpCnt();
		
		// 정규직
		for(int i = 0; i < empCnt[0]; i++) {
			
			System.out.println("아이디 : " + per[i].getid() 
					+ " 이름 :  " + per[i].getName() 
					+ " 부서 :  " + per[i].getDept() 
					+ " 사번 :  " + per[i].getEmpNo() 
					+ " 급여 :  " + (per[i].getSal() * per[i].getBonus())
					+ " 직급 :  " + per[i].getPosition());
			
		}
		
		// 시간제
		for(int i = 0; i < empCnt[1]; i++) {
			
			System.out.println("아이디 :  " + pt[i].getid() 
					+ " 이름 :  " + pt[i].getName() 
					+ " 근무 시간 :  " + pt[i].getWorkTime() 
					+ " 급여 :  " + (pt[i].getSal() * pt[i].getExtraSal()));
			
		}
		
		// 기간제
		for(int i = 0; i < empCnt[2]; i++) {
			
			System.out.println("아이디 :  " + ft[i].getid() 
					+ " 이름 :  " + ft[i].getName() 
					+ " 근무 일자 :  " + ft[i].getWorkDate() 
					+ " 급여 :  " + (ft[i].getSal() + ft[i].getExtraSal()));
			
		}

	}

	// 관리자 기능
	static void manage(EmployeeMain emain) {

		Scanner sc = new Scanner(System.in);
		int option = 6;

		do {

			System.out.println();
			
			System.out.println("현재 사원 - 정규직 : " + emain.getEm().getEmpCnt()[0] 
					+ "명, 시간제 : " + emain.getEm().getEmpCnt()[1] 
							+  "명, 기간제 : " + emain.getEm().getEmpCnt()[2] + "명");
			System.out.println("\n사용할 기능을 선택해주세요.(1~5, 그 외 번호를 입력하면 종료.)");
			System.out.print("1. 사원 추가 / 2. 사원 수정 / 3. 사원 삭제 / 4. 사원 검색 / 5. 전체 사원 조회 : ");

			option = sc.nextInt();

			switch (option) {
			case 1:
				insertEmp(emain); // 사원 추가
				break;
			case 2:
				modEmp(emain); // 사원 수정
				break;
			case 3:
				delEmp(emain); // 사원 삭제
				break;
			case 4:
				searchEmp(emain); // 사원 검색
				break;
			case 5:
				allEmp(emain); // 사원 전채 조회
				break;
			default:
				option = 6;
			}

			// 1~5 중 하나가 아니면 6으로 종료
		} while (option != 6);

	}

	// 일반 사원은 본인의 정보만 확인 가능
	static void general(EmployeeMain emain, String id) {
		
		searchEmp(emain, id);

	}

	static boolean checkPosition(EmployeeMain emain, String id, String pw) {

		// 등록된 정규직, 시간제, 기간제 근로자 가져옴
		Permanent per[] = emain.getEm().getPer();
		PartTime pt[] = emain.getEm().getPt();
		FixedTerm ft[] = emain.getEm().getFt();

		// 각 근로 형태에 따른 근무자 수
		int empCnt[] = emain.getEm().getEmpCnt();

		boolean invalid = false; // 아이디와 비밀번호가 일치하는지 여부
		boolean isManager = false; // 부장 이상인지 여부

		for (int i = 0; i < empCnt[0]; i++) {

			// 정규직인지
			if (per[i].getid().equals(id) && per[i].getPw().equals(pw)) {

				// 찾았으니 true
				invalid = true;

				System.out.print("로그인된 계정 - ");
				System.out.println("사번 : " + per[i].getid() + ", 이름 : " + per[i].getName() + "님.");

				// 부장이상(관리자 인지)
				if (per[i].getPosition().equals("부장")) {

					System.out.println("관리자로 접속하였습니다.");
					isManager = true;

				}

			} else {

				invalid = false;

			}

		}
		
		// 정규직이 아닐때
		if(!invalid) {
			
			for (int i = 0; i < empCnt[1]; i++) {
				
				if (pt[i].getid().equals(id) && pt[i].getPw().equals(pw)) {
					
					invalid = true;
					
					System.out.print("로그인된 계정 - ");
					System.out.println("사번 : " + pt[i].getid() + ", 이름 : " + pt[i].getName() + "님.");
					
				} else {
					
					invalid = false;
					
				}
				
			}
			
			// 시간제가 아닐때
			if (!invalid) {
				
				for (int i = 0; i < empCnt[2]; i++) {
					
					if (ft[i].getid().equals(id) && ft[i].getPw().equals(pw)) {
						
						invalid = true;
						
						System.out.print("로그인된 계정 - ");
						System.out.println("사번 : " + ft[i].getid() + ", 이름 : " + ft[i].getName() + "님.");
						
					} else {
						
						invalid = false;
						
					}
					
				}
				
			}
			
		}
		
		// 검색결과가 없을때
		if (!invalid) {

			System.out.println("등록되지 않은 사원입니다. 아이디와 비밀번호를 확인해주세요.");
			return invalid;

		}

		// 관리자면
		if (isManager) {

			manage(emain);

		} else { // 일반 사원이면

			general(emain, id);

		}

		// 사원이 없으면 다시 로그인으로
		return invalid;

	}

	static void login(EmployeeMain emain) {

		Scanner sc = new Scanner(System.in);
		String id = "";
		String pw = "";
		String check = "";

		// 로그인
		System.out.print("아이디를 입력해주세요. : ");
		id = sc.next();
		System.out.print("비밀번호를 입력해주세요. : ");
		pw = sc.next();

		do {

			// 고용형태 및 직급 구분
			if (checkPosition(emain, id, pw)) {

				System.out.print("\n로그아웃 하시겠습니까(y/n)? : ");
				check = sc.next();

			}

		} while (check.equals("n") || check.equals("N"));

	}

	public static void main(String[] args) {

		// manager 1명, 일반 사원 1명을 만들기 위해 main 생성자 호출
		EmployeeMain emain = new EmployeeMain();
		Scanner sc = new Scanner(System.in);
		String check = "";

		do {

			// 로그인 호출
			login(emain);

			System.out.print("\n종료 하시겠습니까?(y/n) : ");
			check = sc.next();

		} while (check.equals("n") || check.equals("N"));

	}

}

'Language > Java' 카테고리의 다른 글

[JAVA] this에 대해  (0) 2021.02.03
[JAVA] Class에 대해  (0) 2021.02.03
[JAVA] Method호출 방식(Call by Reference, Name, Value)  (0) 2021.02.02
[JAVA]반, 학생 수 를 입력받는 성적 프로그램  (0) 2021.02.01
[JAVA] 별찍기  (0) 2021.01.30