본문 바로가기

수업내용

[Day10][Java] 상속 / 구인구직 관리 프로그램

구인구직 관리 프로그램을 만들어 보자.

 

-- Package 1개(my.day11.a.inheritance)와 Class 4개(MainApp, Company, Member, Gujikja)를 생성한다.

 

▶▶ Member 클래스

 

 

 

package my.day11.a.inheritance;

public class Member {
		
	String id;
	String passwd;
	String name;

	boolean isExists(String id, String passwd) {	
		if(this.id.equals(id) && this.passwd.equals(passwd))
			return true;
		else 
			return false;
	}
}

 

 

 

-- Member 클래스는 Gujikja 클래스와 Company 클래스의 공통 field와 공통 method를 정의해주는 클래스로 사용

-- 공통으로 사용하는 id, passwd(password), name을 선언하고 새로 입력 받은 id와 passwd가 이미 있는 값과 같은지 비교하는 함수(isExists)를 생성한다.

-- 입력 받은 id와 passwd와 같다면 true, 같지 않다면 false를 반환한다. (로그인할 때 필요)

 

 

 

▶▶ Company 클래스

 

 

 

package my.day11.a.inheritance;

public class Company extends Member{
	long seedMoney;
	String jobType;
	
	public Company() {
	}
    
	public Company(String id, String passwd, String name, long seedMoney, String jobType) {
		this.id = id;
		this.passwd = passwd;
		this.name = name;
		this.seedMoney = seedMoney;
		this.jobType = jobType;
	}
    
	void showCompanyInfo() {
		String result = "";

		result += "1. 아이디 : " + super.id + "\n";
		result += "2. 암   호 : " + super.passwd + "\n";
		result += "3. 회사명 : " + super.name + "\n";
		result += "4. 자본금 : " + seedMoney + "\n";
		result += "5. 업종명 : " + jobType + "\n";
		

		System.out.println(result);
	}
}

 

 

 

 

-- Member 클래스를 상속 받아 Member 클래스의 field와 method를 사용할 수 있다.

-- Member 클래스에서 받아올 수 없는 변수 seedMoney(자본금), jobType(업종명)을 선언한다.

-- 파라미터(id, passwd, name, seedMoney, jobType)가 있는 생성자를 만든다.

-- 파라미터가 있는 생성자를 생성하였으므로 기본 생성자도 만들어 줘야 한다.

-- showCompanyInfo() 이름으로 아이디, 암호, 회사명, 자본금, 업종명을 출력하는 함수를 만든다.

 

 

 

 

▶▶ Gujikja 클래스

package my.day11.a.inheritance;

import java.util.Calendar;

public class Gujikja extends Member{
	String birthday;	
	int    gender;
	int    school;
	int	   hopeMoney;
	
	public Gujikja(String id, String passwd, String name, String birthday, int gender, int school,
		       int hopeMoney) {
	this.id = id;
	
	this.passwd = passwd;
	this.name = name;
	this.birthday = birthday;
	this.gender = gender;
	this.school = school;
	this.hopeMoney = hopeMoney;
}
	public Gujikja() { }
}

 

 

 

-- Member 클래스를 상속 받아 Member 클래스의 field와 method를 사용할 수 있다.

-- Member 클래스에서 받아올 수 없는 변수 birthday(생일), gender(성별), school(학력), hopeMoney(희망연봉) 을 선언한다.

-- 파라미터가 있는 생성자와 기본 생성자도 만든다.

 

 

 

void showGujikInfo() {
		String result = "";
		result += "1. 아이디 : " + super.id + "\n";
		result += "2. 암   호 : " + super.passwd + "\n";
		result += "3. 성   명 : " + super.name + "\n";
		result += "4. 생년월일 : " + birthday.substring(0,4) + "-" + 
								  birthday.substring(4,6) + "-" + 
								  birthday.substring(6) + "\n";
		
		String strGender = "";
		if(gender == 1) 
			strGender = "남";
		else
			strGender = "여";
			
		result += "5. 성   별 : " + strGender + "\n";
		
		String strSchool = "";
		if(school == 1) 
			strSchool = "대졸이상";
		else if(school == 2) 
			strSchool = "초대졸";
		else if(school == 3) 
			strSchool = "고졸";
		else
			strSchool = "고졸미만";
		
		result += "6. 학   력 : " + strSchool + "\n";
		result += "7. 희망연봉 : " + hopeMoney + "만원\n";
		
		System.out.println(result);
	}

 

 

 

-- showGujikjaInfo() 이름으로 아이디, 암호, 성명, 생년월일, 성별, 학력, 희망연봉을 출력하는 함수를 만든다.

-- gender는 int로 선언하여 남자는 1, 여자는 2로만 받을 수 있게 만들었으므로 출력을 할 때에는 1을 입력했을 때 "남자", 2를 입력했을 때 "여자"라는 문자열이 출력되도록 한다.

-- 학력도 int로 선언하였으므로 1은 "대졸이상", 2는 "초대졸", 3은 "고졸", 4는 "고졸미만"이라는 문자열이 출력되도록 한다.

 

 

 

int getAgeLine() {
		
		Calendar currentDate = Calendar.getInstance();
		int currentYear = currentDate.get(Calendar.YEAR);
		
		int birthYear = Integer.parseInt(birthday.substring(0,4));
		
		int currentAge = currentYear - birthYear +1;
		
		return (currentAge/10)*10;
	}

 

 

 

-- getAgeLine() 이름의 생년월일로 연령대를 알 수 있는 함수를 만든다.

-- java.util.Calendar를 import하여 현재의 년도를 받아온다.

-- 생년월일에서 생년만 잘라서 (현재 년도-구직자의 생년+1)을 연산하여 현재 나이를 구한다.

-- 데이터 타입이 int형이므로 현재 나이를 10으로 나누고 10을 다시 곱해 일의 자리를 버린다.

예> 24 ÷ 10 = 2.4 → int는 정수만 받아오므로 2로 변한다. 다시 10을 곱하면 2 × 10 = 20

 

 

 

▶▶ MainApp 클래스(main method 안)

package my.day11.a.inheritance;

import java.util.Scanner;

public class MainApp {

	public static void main(String[] args) {

		Gujikja[] gujaArr = new Gujikja[5];
		
		gujaArr[0] = new Gujikja("hongkd", "1234", "홍길동", "19930311", 1, 1, 4000);
		gujaArr[1] = new Gujikja("eom", "9876", "엄정화", "19830311", 2, 2, 5000);
		gujaArr[2] = new Gujikja("leess", "abcd", "이순신", "20010919", 1, 2, 3000);

		Company[] compArr = new Company[4];
		
		compArr[0] = new Company("samsung","1234","삼성",300000000000L,"제조업");
		compArr[1] = new Company("LG","1234","엘지",250000000000L,"서비스업");
		
		Scanner sc = new Scanner(System.in);
		String strMenuNo = "";
		
		Gujikja loginUser = null;
		Company loginCompany = null;
		
		do {
			showMenu(loginUser);
			System.out.print("▷ 메뉴번호 선택 => ");
			strMenuNo = sc.nextLine(); 
			
			switch (strMenuNo) {
				case "1": 
					Gujikja guja = registerGujikja(sc);
					saveGujaArr(guja, gujaArr);
					
					break;
	
				case "2": 
					loginUser = loginGujikja(sc, gujaArr);
					break;
					
				case "3": 
					if(loginUser == null) {
						System.out.println(">> 로그인을 한 후에 로그아웃을 할 수 있습니다.\n"); 
					}
					else {
						loginUser = null;
						System.out.println(">> 로그아웃 되었습니다\n");
					}
					
					break;	
					
				case "4":  
					if(loginUser == null) {
						System.out.println(">> 먼저 로그인 하세요!!\n");
					}
					else {
						loginUser.showGujikInfo();
					}
					
					break;
				
				case "5": 
					if(loginUser == null) {
						System.out.println(">> 먼저 로그인 하세요!!\n");
					}
					else {
						for(int i=0; i<gujaArr.length; i++) {
							if(gujaArr[i] != null)
							   gujaArr[i].showGujikInfo();
						}
					}
					
					break;
					
				case "6": 
					searchSubMenu(sc, gujaArr);
					break;
				
				case "7":  
					Company comp = registerCompany(sc);
					saveCompArr(comp, compArr);
				
				case "8": 
					loginCompany = loginCompany(sc, compArr);
					break;
					
				case "9": 
					
					break;
					
				default: 
					System.out.println(">>> 메뉴에 없는 번호 입니다.\n");
					break;
				}
			
		} while ( !("9".equals(strMenuNo)) );
		
		sc.close();
		System.out.println("\n== 프로그램 종료 ==");
	}

}

 

 

 

-- 구직자와 구인회사 정보를 저장하는 배열에 값을 넣는다.

-- Scanner와 switch case를 사용하여 값을 입력 받고 1~9번까지 입력했을 때 메뉴 번호에 맞는 함수를 호출하게 한다.

-- case "3" : 이미 로그아웃 된 상태라면 "로그인을 한 후에 로그아웃을 할 수 있습니다" 출력, 로그인 되어있는 상태라면 로그아웃 후 "로그아웃 되었습니다." 메시지를 출력한다.

-- case "4", "5" : 로그인하지 않은 상태라면 "먼저 로그인 하세요!!" 메시지를 출력한다.

-- case "9" : 9번을 입력하면 메뉴 번호 입력 받는 것을 멈추고 "==프로그램 종료=="를 출력한다.

 

 

 

 

▶▶ MainApp 클래스(main method 밖)

static void showMenu(Gujikja loginUser) {
		
		String str = "";
		
		if (loginUser != null) {
			str = "["+loginUser.name + "님 환영합니다]";
		}
		
		System.out.println("  == 메뉴"+str+" ==\n"
				         + " 1.구직자 가입  2.구직자로그인  3.로그아웃  4.나의정보조회"
                         + "5.모든구직자정보조회 \n6.검색에 따른 조회  7.구인회사가입"  
                         + "8.구인회사로그인  9.프로그램종료\n"); 
	}

 

 

 

-- showMenu method : 메뉴를 보여준다.

-- 만약 로그인이 되어있다면 로그인 한 member의 name을 "님 환영합니다"라는 메시지와 함께 출력한다.

 

 

 

 

static Gujikja registerGujikja(Scanner sc) {
		
		System.out.println("=== 구직자 가입하기 ===");
		
		System.out.print("◆  아이디 : ");
		String id = sc.nextLine();
		
		System.out.print("◆  암호 : ");
		String passwd = sc.nextLine();
		
		System.out.print("◆  성명 : ");
		String name = sc.nextLine();
		
		System.out.print("◆  생년월일(예: 19930820) : ");
		String birthday = sc.nextLine();
		
		String strGender = ""; 
        
		do {
			System.out.print("◆  성별[ 남(1) / 여(2)] : ");
			strGender = sc.nextLine();
			if("1".equals(strGender) || "2".equals(strGender)) {
				break;
			}
			else {
				System.out.println(">> 성별은 1 또는 2 만 입력하세요!!\n");
			}
		} while (true);
		
		String strSchool = "";
		do {
			System.out.print("◆  학력[ 대졸이상(1) / 초대졸(2) / 고졸(3) / 고졸미만(4)] : ");
			strSchool = sc.nextLine();
			if("1".equals(strSchool) || 
			   "2".equals(strSchool) ||
			   "3".equals(strSchool) ||
			   "4".equals(strSchool) ) {
				break;
			}
			else {
				System.out.println(">> 학력은 1,2,3,4 중에 하나만 입력하세요!!\n");
			}
		} while (true);
		
		int hopeMoney = 0;
		do {
			System.out.print("◆  희망급여 : ");
			try {
				hopeMoney = Integer.parseInt(sc.nextLine());
				if(hopeMoney > 0)
					break;
				else
					System.out.println(">> 희망연봉은 0 보다 커야 합니다.\n");
			} catch(NumberFormatException e) {
				System.out.println(">> 숫자로만 입력하세요!!\n");
			}
		} while(true);
		
		Gujikja guja = new Gujikja();
		guja.id = id;
		guja.passwd = passwd;
		guja.name = name;
		guja.birthday = birthday;
		guja.gender = Integer.parseInt(strGender);
		guja.school = Integer.parseInt(strSchool);
		guja.hopeMoney = hopeMoney;
		
		return guja;
	}

 

 

 

-- registerGujikja() 라는 구직자의 아이디, 암호, 성명, 생년월일, 성별(숫자), 학력(숫자), 희망연봉을 받아오는 함수를 만든다.

 

 

 

static void saveGujaArr(Gujikja guja, Gujikja[] gujaArr) {
		
		boolean flag = false; 
		
		for(int i=0; i<gujaArr.length; i++) {
			if( gujaArr[i] == null ) {
				gujaArr[i] = guja;
				flag = true;
				break;
			}
		}
		
		if(flag)
			System.out.println(">> 회원가입 성공!!\n");
		else
			System.out.println(">> 회원가입 만료가 되어 더이상 신규회원 가입불가합니다.\n");	
	}

 

 

 

-- 입력 받은 구직자의 정보를 gujaArr라는 배열에 대입한다.

-- 만약 배열에 남는 공간이 없다면 "회원가입 만료가 되어 더이상 신규회원 가입불가합니다."라는 메시지를 출력한다.

 

 

 

static Gujikja loginGujikja(Scanner sc, Gujikja[] gujaArr) {
		
		Gujikja loginUser = null;
		
		System.out.print("◆  아이디 : ");
		String userid = sc.nextLine();
		
		System.out.print("◆  암호 : ");
		String passwd = sc.nextLine();
		
		boolean flag = false;
		
		for(int i=0; i<gujaArr.length; i++) {
			if( gujaArr[i] != null && 
				gujaArr[i].isExists(userid, passwd) ) {
				flag = true;
				loginUser = gujaArr[i];
				break;
			}
		}
		
		if(flag==true) 
			System.out.println(">> 로그인 성공!! <<\n");
		else
			System.out.println(">> 로그인 실패!! <<\n");
		
		return loginUser;
	}

 

 

 

-- isExists 함수를 호출하여 아이디와 암호를 입력받은 값과 비교하고 깃발(boolean flag)를 선언하여 같은 아이디와 암호가 있을 때 true, 아니면 계속 false를 유지한다.

-- flag가 true로 바뀌었으면 "로그인 성공", 계속 false라면 "로그인 실패"라는 메시지를 출력한다.

 

 

 

static void searchSubMenu(Scanner sc, Gujikja[] gujaArr) {

		String menuNo = "";
		do {
			System.out.println("  == 검색 조회 메뉴 ==\n1.이름으로 검색  2.학력으로 검색  3.연령대검색  4.처음메뉴로 돌아가기\n");
			System.out.print("▶ 메뉴번호 선택 => ");
			menuNo = sc.nextLine();
			
			switch (menuNo) {
				case "1": 
					searchByName(sc, gujaArr);
					break;
					
				case "2":
					searchBySchool(sc, gujaArr);
					break;
					
				case "3": 
					searchByAgeLine(sc, gujaArr);
					break;
					
				case "4":
					
					break;
	
				default:
					System.out.println(">> 메뉴번호에 존재하지 않는 값을 입력하셨습니다\n"); 
					break;
			}
			
		} while( !("4".equals(menuNo) ) );
		
	}
	
	static void searchByName(Scanner sc, Gujikja[] gujaArr) {
		
		System.out.print("▶검색할 성명 => ");
		String searchName = sc.nextLine(); // 홍
		
		boolean flag = false;
		
		for(int i=0; i<gujaArr.length; i++) {
			if(gujaArr[i] != null &&  
			   gujaArr[i].name.startsWith(searchName) ) {
				flag = true;
				gujaArr[i].showGujikInfo();
			}
		}
		
		if(!flag)
			System.out.println(">> 검색하려는 "+searchName+"은 존재하지 않습니다\n"); 
		
	}
	
	static void searchBySchool(Scanner sc, Gujikja[] gujaArr) {
		
		System.out.print("▶검색할 학력[대졸이상(1), 초대졸(2), 고졸(3), 고졸미만(4)] => ");
		String schoolType = sc.nextLine(); // "2"
				
		boolean flag = false;
		
		for(int i=0; i<gujaArr.length; i++) {
			if( gujaArr[i] != null &&  
			    String.valueOf(gujaArr[i].school).equals(schoolType) ) {
				flag = true;
				gujaArr[i].showGujikInfo();
			}
		}
		
		if(!flag)
			System.out.println(">> 검색하려는 학력의 구직자는 존재하지 않습니다\n");
		
	}
	
	static void searchByAgeLine(Scanner sc, Gujikja[] gujaArr) {
	
		boolean flag = false;
		
		do {
			System.out.print("▶검색할 연령대 => ");
			try {
				int ageLine = Integer.parseInt(sc.nextLine()); // 20
				
				if(ageLine < 0) {
					System.out.println(">> 검색할 연령대는 음수는 불가합니다!!\n");
				}
				else {
					for(int i=0; i<gujaArr.length; i++) {
						if(gujaArr[i] != null &&
						   gujaArr[i].getAgeLine() == ageLine) {
						   flag = true;
						   gujaArr[i].showGujikInfo();
						}	
					}
					break;
				}
				
			} catch(NumberFormatException e) {
				System.out.println(">> 숫자로 입력하세요!!\n");
			}
			
		} while(true);
		
		if(!flag)
			System.out.println(">> 검색하고자 한 연령대의 구직자는 없습니다.\n");
	}

 

 

 

-- 6번을 입력했을 때 검색 조회 메뉴를 출력하고 번호를 선택하여 여러 방법으로 검색할 수 있도록 한다.  (1. 이름으로 검색, 2. 학력으로 검색, 3. 연령대로 검색) 

-- searchByName(), searchBySchool(), searchByAgeLine() 함수를 생성하고, 그 함수에서 gujaArr에 저장된 값을 비교하여 일치한 구직자 정보를 나타내어 준다.

 

 

 

static Company registerCompany(Scanner sc) {
		Company comp = null;
		
		System.out.println("=== 구인회사 가입하기 ===");
		
		System.out.print("◆  아이디 : ");
		String id = sc.nextLine();
		
		System.out.print("◆  암호 : ");
		String passwd = sc.nextLine();
		
		System.out.print("◆  회사명 : ");
		String name = sc.nextLine();
		
		long seedMoney = 0;
		do {
			System.out.print("◆  자본금 : ");
			
			try {
				 seedMoney = Long.parseLong(sc.nextLine());
			} catch(NumberFormatException e) {
				System.out.println(">> 자본금은 숫자로만 입력하세요\n");
				continue;
			}
			
			if(seedMoney > 0)
				break;
			else
				System.out.println(">> 자본금은 0 보다 커야 합니다\n"); 
			
		} while(true);
				
		System.out.print("◆  업종명 : ");
		String jobType = sc.nextLine();
		
		comp = new Company(id, passwd, name, seedMoney, jobType);
		
		return comp;
	}
	
	
	static void saveCompArr(Company comp, Company[] compArr) { 
		
		boolean flag = false;
		
		for(int i=0; i<compArr.length; i++) {
			if(compArr[i] == null) {
				compArr[i] = comp;
				flag = true;
				break;
			}
		}
		
		if(flag)
			System.out.println(">> 구인회사 가입 성공!!\n");
		else
			System.out.println(">> 구인회사 엔트리가 포화상태라서 신규회사 가입불가함!!\n");
	}
	
	static Company loginCompany(Scanner sc, Company[] compArr) {
		
		Company loginComp = null;
		
		System.out.print("▶아이디 : ");
		String id = sc.nextLine();
		
		System.out.print("▶암  호 : ");
		String passwd = sc.nextLine();
		
		boolean flag = false;
		
		for(int i=0; i<compArr.length; i++) {
			if(compArr[i] != null &&
			   compArr[i].isExists(id, passwd) ) {
			   loginComp = compArr[i];
			   flag = true;	
			   break; 	
			}
		}
		
		if(flag)
			System.out.println(">> 구인회사로 로그인 성공!!");
		else
			System.out.println(">> 구인회사로 로그인 실패!!");
		
		return loginComp;
	}

 

 

 

-- 구직자의 회원가입, 로그인 함수와 마찬가지로 구인회사 회원가입(registerCompany), 로그인(loginCompany) 함수를 만들어 메인 함수에서 호출될 수 있도록 한다.