Abstraction ( 추상화 )

양혜정·2024년 2월 4일
0

Begin_java

목록 보기
50/71

추상화

  • 실제 데이터들을 모델링하는 기술

메인메뉴

void main_menu(){
	System.out.println("\n === 메인메뉴 === \n"
    	+ "1. 구직자 회원가입 2. 구직자 모두보기 3. 검색하기");
    System.out.print("▷ 메뉴번호 선택 : ");
}	// end of void main_menu()-----------------

구직자 회원가입

	void register(Scanner sc, Gujikja[] gu_arr) {
		if(Gujikja.count < gu_arr.length) {	// 회원가입 가능
	    	String userid;
	        String passwd;
	        String name;
	        String jubun;
	      	
	    boolean isUse_userid = true;
        // do~while 조건문에 넣어주기 위해 do 밖에서 선언
        // @@@@@@@ 아이디 @@@@@@@@
        do{
           isUse_userid = true;	// 틀릴경우 반복될것이기 때문에
           System.out.print("아이디 : ");
           userid = sc.nextLine();
           if(userid.isBlank()) { // userid 가 공백이라면
           		System.out.println
                  (">> 공백이 아닌 아이디를 입력하세요\n");
                isUse_userid = false;
           }
           // 가입된 회원들 중복아이디 검사하기
           for(int i=0; i<Gujikja.count; i++) {
               if(userid.equals(gu_arr[i].userid)) {
               	 System.out.println
                   (">> 이미 동일한 아이디가 있습니다\n");
                 isUse_userid = false;
                 break;
               }
           }	// end of for----------
  		} while(!isUse_userid);	// end of do~while-------
		}	// end of if ---(회원가입이 가능한 경우)
###########################################################
		// @@@@@@@ 비밀번호 @@@@@@@@
		boolean isUse_passwd = true;
        // do~while 조건문에 넣어주기 위해 do 밖에서 선언
        do{
        	isUse_passwd = true;
            	// 틀릴경우 반복될것이기 때문에
        	System.out.println("\n비밀번호는 8~10 글자로 "
            +"대,소문자,숫자,특수문자가 혼합되어야 합니다.");
           	System.out.print("비밀번호 : "); 
           	passwd = sc.nextLine();
            if(passwd.isBlank()) { // 공백이라면
           		System.out.println
                  (">> 공백이 아닌 비밀번호를 입력하세요\n");
                isUse_passwd = false;
                continue;	// 다시 입력할 기회를 준다.
           }
           int length = passwd.length();
           // 글자수를 8~10 으로 설정
           if(length < 8 || length > 10)
           	  isUse_passwd = false;	
              
           boolean flag_upper = false;	// 영문대문자 표시
           boolean flag_lower = false;	// 영문소문자 표시
           boolean flag_number = false;	// 숫자 표시
           boolean flag_special = false;// 특수문자 표시
           
           for(int i=0; i<length; i++) {
           		char ch = passwd.charAt(i);
                // passwd 글자를 char 타입으로 변경
                if('가' <= ch && ch <= '힣')	{ 
                // 한글을 적은경우
                	System.out.println
                    ("[경고] 한글이 아닌 문자로 적어주세요.");
                	isUse_passwd = false;
                	break;	// 더이상 검사할 필요가 없다.
                } else if(' ' == ch) { 	// 공백을 적은경우
                	System.out.println
                    ("\n[경고] 공백이 아닌 문자로 적어주세요.");
                	isUse_passwd = false;
                	break;	// 더이상 검사할 필요가 없다.
                }
                if(Character.isUpperCase(ch))	
                	flag_upper = true;	// 영문대문자
                else if(Character.isLowerCase(ch))	
                	flag_lower = true;	// 영문소문자
                else if(Character.isDigit(ch))		
                	flag_number = true;	// 숫자
                else							
                	flag_special = true;// 특수문자
                
                if(!(flag_upper && flag_lower
                	&& flag_number && flag_special))
                	// 하나라도 참이 아니라면 false
                   	isUse_passwd = false;
           }	// end of for--------
           if(!isUse_passwd)
        	   System.out.println
               ("[경고] 비밀번호는 8~10 글자로 대,소문자,숫자,"
              + "특수문자가 혼합되어야 합니다.\n");
       } while(!isUse_passwd);	// end of do~while----
###########################################################
		// @@@@@@@ 성명 @@@@@@@@
        boolean isUse_name = true;
        // do~while 조건문에 넣어주기 위해 do 밖에서 선언
        do{
        	isUse_name = true;
            // 틀릴경우 반복될것이기 때문에
            System.out.println("\n성명은 2~6 글자로 "
            +"공백이 없는 한글로만 이루어져야 합니다.");
           	System.out.print("성명 : "); 
           	name = sc.nextLine();
            
            if(2<=name.length() && name.length() <= 6) {
            	for(int i=0; i<name.length(); i++) {
                	if(!('가' <= name.charAt(i)
                    			&& name.charAt(i) <= '힣')) {
                    	isUse_name = false;
                        System.out.println
           ("[경고] 성명은 공백없이 한글로만 입력하셔야 합니다.");
                        break;
                    }
               }	// end of for---------
            } else{
            	isUse_name = false;
                System.out.println
                ("[경고] 2글자 이상 6글자 이하 "
                +"공백없는 한글로만 이루어져야 합니다.");
            }	// end of if~else----------
        } while(!isUse_name);
  ###########################################################
		// @@@@@@@ 주민번호 @@@@@@@@
        boolean isUse_jubun = true;
        // do~while 조건문에 넣어주기 위해 do 밖에서 선언
        do{
        	isUse_jubun = true;
            // 틀릴경우 반복될것이기 때문에
            System.out.println("\n주민번호는 앞에서부터 "
           		+ " 7자리 입력해주세요 ");
           	System.out.print("주민번호 : "); 
           	jubun = sc.nextLine();
            if(jubun.length() != 7) {
            	isUse_jubun = false;
            } else if(!("1".equals(jubun.substring(6)) 
            || "2".equals(jubun.substring(6))
            || "3".equals(jubun.substring(6)) 
            || "4".equals(jubun.substring(6)))) {
            // 태어난 년도가 1900 년생 이상의 한국인이 아닌경우
            	isUse_jubun = false;
            } else {	// 7자리 입력
            			// 태어난 년도가 1900년 이상의 한국인
                 String str_birthday = "";	// 생년월일
                 if("1".equals(jubun.substring(6)) 
                 	|| "2".equals(jubun.substring(6))) {
                	 str_birthday = "19" 
                     				+ jubun.substring(0,6);
            	 } else{
                 	str_birthday = "20" 
                    				+ jubun.substring(0,6);
                 }	// end of if~else---------
                 
                 // 날짜 보기쉬운 형태로 바꾸기
                 SimpleDateFormat sdformat 
                 		= new SimpleDateFormat("yyyyMMdd");
            	// 유효성 검사하는 기능 넣기
                sdformat.setLenient(false);
                // 유효성 검사하기
                try{
                	// 문자열을 날짜 형태로 바꾸기
                	Date birthday 
                    		= sdformat.parse(str_birthday);
                    // 현재 날짜와 비교해주어야하니 선언
                    Date now = new Date();
					// 보기쉬운형태로 바꾸며 시분초빼기
                    String str_now = sdformat.format(now);
                    // 문자열을 날짜 형태로 바꾸기
                    now = sdformat.parse(str_now);
                    if(birthday.after(now))
                    	isUse_jubun = false;
                    else
                    	isUse_jubun = true;
                 } catch (ParseException e) {	
                 	// 달력에 없는 경우
                	 	isUse_jubun = false;
                 }	// end of try~catch------
            }	// end of if~else----------
	         if(!isUse_jubun)
	         	System.out.println
                	("[경고] 올바른 주민번호를 입력하세요!!\n");
         } while(!isUse_jubun);	// end of do~while--------
        
        Gujikja gu = new Gujikja();	// 새로운구직자로 등록하기
        gu.userid = userid;
        gu.passwd = passwd;
        gu.name = name;
        gu.jubun = jubun;
        
        gu_arr[Gujikja.count++] = gu;// 구직자 배열에 추가하기
        
        System.out.println(">> 구직자 회원가입 성공!! <<\n");
	}	// 회원가입 가능할 경우
  	else {	// 구직자 회원수가 gu_arr.length(정원)이 되었을 경우
			System.out.println(">> 정원 " 
            + gu_arr.length 
        +"명이 꽉차서 구직자 회원가입이 어렵습니다.\n죄송합니다.");
	}	// end of if~else--------------        
}	// end of void register(sc, gu_arr)--------------       

- 구직자 모두보기

public void view_all_info(Gujikja[] gu_arr) {
	if(Gujikja.count == 0)
      System.out.println(">> 구직자로 가입된 회원이 없습니다.");
    else{	// 회원이 있을 경우
    	title();	// 구직자 타이틀
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<Gujikja.count; i++) {
        	// 회원 정보나열 쌓기
        	sb.append(gu_arr[i].getInfo() + "\n");
        }	// end of for-----------------
        // 쌓아둔 것 문자열로 바꾸어 출력하기
        System.out.println(sb.toString());
	 }	// end of if~else---------------
}	// end of public void view_all_info(Gujikja[] gu_arr)---
// @@@@@@ 구직자 타이틀 @@@@@@@@@@
void title() {
	System.out.println("-".repeat(80) + "\n"
    	+ "아이디   비밀번호\t\t 성명   생년월일   성별"
        + "   현재만나이   가입일자\n"
        + "-".repeat(80));
}	// end of void title()-----------------
###########################################################
// @@@@@@ 구직자 정보 나열 @@@@@@@@@@ (Gujikja class)
String getInfo() {
	StringBuilder sb = new StringBuilder();
    sb.append(userid + "\t");
    // 정보 보호를 위해 비밀번호 앞 3자리를 제외한 문자에 * 넣기
    String str_star = "*".repeat(passwd.length()-3);
    sb.append(passwd.substring(0,3) + str_star + "\t");
    sb.append(name + "\t");
    sb.append(jubun.substring(0,6) + "\t");
    
    // === 성별구하기 === //
    if("1".equals(jubun.substring(6)) 
    || "3".equals(jubun.substring(6)))
    	sb.append("남" + "\t");
    else
    	sb.append("여" + "\t");
    
    // === 만나이 구하기 === //
    int age = 0;
    // ## 구직자가 올해 생일이 지난경우,
    // 		나이 = 현재년도 - 구직자의 태어난 년도
    // ## 구직자가 올해 생일이 지나지 않은 경우,
    // 		나이 = 현재년도 - 구직자의 태어난 년도 -1
    
    Date now = new Date();	// 현재시각
    // 보기 쉬운타입으로 바꾸기
    SimpleDateFormat sdfmt
    					= new SimpleDateFormat("yyyyMMdd");
    // 문자열타입으로 바꾸기
    String str_now = sdfmt.format(now);
    
    // 구직자의 올해 생일
    String str_now_birthday = str_now.substring(0,4)
    								+ jubun.substring(2,6);

	// 현재년도
	int now_year = Integer.parseInt(str_now.substring(0,4));
    // 구직자의 년대구하기(1900,2000)
    int centry = ("1".equals(jubun.substring(6))
    		|| "2".equals(jubun.substring(6)))?1900:2000;
    // 구직자의 태어난년도 구하기
    int birth_year = centry 
    			+ Integer.parseInt(jubun.substring(0,2));
	try{
    	// 문자열을 날짜타입으로 변환
    	now = sdfmt.parse(str_now);
        Date now_birthday = sdfmt.parse(str_now_birthday);
       	if(now_birthday.compareTo(now) > 0) 	// 미래
        	age = now_year - birth_year -1;
        else
        	age = now_year - birth_year;       
    } catch (ParseException e) {
    //유효성검사를 미리했기 때문에 예외가 나올리 없다.
 	}	// end of try~catch-------------------
    sb.append(age + "\t");
    sb.append(register_day.substring(0,11));
    // 쌓아둔것을 문자열로 return 하기
    return sb.toString();
 }	// end of String get Info()-----------------------

- 검색하기

// 검색하기 메뉴를 보여주는 메소드
void search_menu(Scanner sc, Gujikja[] gu_arr) {
	String str_menuno = "";
    // do~while 조건문에 넣어주기 위해 do 밖에서 선언
    do{
    	System.out.println("\n === 검색메뉴 === \n"
        				+ "1. 연령대검색 2. 성별검색 "
                        + "3. 연령대 및 성별검색 "
                        + "4. 메인메뉴로 돌아가기");
        System.out.print("▷ 메뉴번호 선택 : ");
        str_menuno = sc.nextLine();
        switch(str_menuno) {
        	case "1" : 	// 연령대 검색
                search_ageLine(sc, gu_arr);
                break;
            case "2" : 	// 성별 검색
                search_gender(sc, gu_arr);
                break;
            case "3" :	// 연령대 및 성별 검색
            	search_ageLine_gender(sc, gu_arr);
                break;
            case "4" : 	// 메인메뉴로 돌아가기
            	break;
            default :	// 보기에 없는 번호를 입력한 경우
            	System.out.println
              ("[경고] 검색메뉴에 존재하는 번호만 입력하세요\n");
                break;
        }	// end of switch(str_menuno)--------
    } while(!("4".equals(str_menuno)));	// end of do~while--
}	// end of void search_menu(sc, gu_arr)---------------
###########################################################
// @@@@@@ 연령대 검색 @@@@@@@@@@
void search_ageLine(Scanner sc, Gujikja[] gu_arr) {
	if(Gujikja.count == 0) {	// 구직자가 없을 경우
    System.out.println(">> 구직자로 가입된 회원이 없습니다.\n");
    } else{	// 구직자가 있는 경우
    	String str_ageLine = "";
        
        outer:
        do{
        	System.out.println("0~80 대까지 입력 가능합니다.");
        	System.out.print
            	("▷ 검색하고자 하는 연령대 [예 : 20] => ");
            str_ageLine = sc.nextLine();
            switch(str_ageLine) {
            case "0" : 
            case "10" :
            case "20" :
            case "30" :
            case "40" :
            case "50" :
            case "60" :
            case "70" :
            case "80" :
            	break outer;
            default :
            	System.out.println
                ("[경고] 올바른 연령대를 입력하세요\n");
                continue;
            }	// end of switch(str_ageLine)------
       } while(true);	// end of do~while-----
       
 // 입력받은 연령대에 해당하는 구직자 찾기
 		StringBuilder sb = new StringBuilder();
        boolean isSearch = false;
        for(int i=0; i<Gujikja.count; i++) {
        // 연령대는 10 단위니까 int 타입을 10 으로
        // Ex) 26/10 => (int) 2
        //	   26/10*10 => (int) 20
        // == 구직자의 만나이를 통해 연령대 구하기 == // 
          int ageLine = gu_arr[i].getAge()/10*10;
          if(Integer.parseInt(str_ageLine) == ageLine) {
          // 검색하고자 한 값이 연령대가 같다면,
              isSearch = true;
              sb.append(gu_arr[i].getInfo() + "\n");
              // 정보가 나열된 값이 쌓인다.
          }
        }	// end of for----------
        if(isSearch) {	// 같은 값이 있다면.
        	title();
            System.out.println(sb.toString());
        // 쌓아둔 값을 문자열로 출력한다.
        } else { // 없을 경우
        	System.out.println("[검색결과 연령대 " 
            + str_ageLine + "대인 구직자는 없습니다.]");
        }	// end of if~else-----
    }	// end of if~else---------------
}	// end of void search_ageLine(sc, gu_arr)------------
###########################################################
// @@@@@@ 구직자의 만나이 구하기 (Gujikja class) @@@@@@@@@@
int getAge() {
	int age = 0;
	// ## 구직자가 올해 생일이 지난경우,
    // 		나이 = 현재년도 - 구직자의 태어난 년도
	// ## 구직자가 올해 생일이 지나지 않은 경우,
	// 		나이 = 현재년도 - 구직자의 태어난 년도 -1

    Date now = new Date();	// 현재시각
	// 보기 쉬운타입으로 바꾸기
 	SimpleDateFormat sdfmt
	    			= new SimpleDateFormat("yyyyMMdd");
	// 문자열타입으로 바꾸기
	String str_now = sdfmt.format(now);

	// 구직자의 올해 생일
	String str_now_birthday = str_now.substring(0,4)
	    						+ jubun.substring(2,6);

	// 현재년도
	int now_year = Integer.parseInt(str_now.substring(0,4));
	// 구직자의 년대구하기(1900,2000)
	int centry = ("1".equals(jubun.substring(6))
	    	|| "2".equals(jubun.substring(6)))?1900:2000;
	// 구직자의 태어난년도 구하기
	int birth_year = centry 
	    		+ Integer.parseInt(jubun.substring(0,2));
	try{
	    // 문자열을 날짜타입으로 변환
	   	now = sdfmt.parse(str_now);
	    Date now_birthday = sdfmt.parse(str_now_birthday);
	   	if(now_birthday.compareTo(now) > 0) 	// 미래
	        age = now_year - birth_year -1;
	    else
	        age = now_year - birth_year;       
	    } catch (ParseException e) {
	    //유효성검사를 미리했기 때문에 예외가 나올리 없다.
	 	}	// end of try~catch-------------------
		return age;
	}	// end of int getAge()----------
###########################################################
// @@@@@@ 성별 검색 @@@@@@@@@@
void search_gender(Scanner sc, Gujikja[] gu_arr) {
	if(Gujikja.count == 0) {	// 구직자가 없을 경우
    System.out.println(">> 구직자로 가입된 회원이 없습니다.\n");
    } else{	// 구직자가 있는 경우
    	String input_gender = "";
        boolean isUse_input_gender = false;
        do{
        	System.out.print
            	("▷ 검색하고자 하는 성별 [남/여] => ");
            input_gender = sc.nextLine();
            switch (input_gender.trim()) {
            case "남" :
            case "여" :	// 남 또는 여 일 경우
              isUse_input_gender = true;
              input_gender = input_gender.trim();
              // 한글자 이므로 isblank가 아닌 trim 사용가능
            	break;
            default :	// 남 또는 여 가 아닐 경우
            	System.out.println
                ("[경고] \"남\" 또는 \"여\"만 입력하세요!\n");
         		break;
            } 	// end of switch(input_gender.trim())----
      } while(!isUse_input_gender);	// end of do~while----
// 입력받은 성별에 해당하는 구직자 찾기
	  StringBuilder sb = new StringBuilder();
      boolean isSearch = false;
      
      for(int i=0; i<Gujikja.count; i++) {
      	// === 기존 구직자들의 성별 구하기 === //
          if(input_gender.equals(gu_arr[i].getGender())) {
          // 검색하고자 한 성별이 같다면,
              isSearch = true;
              sb.append(gu_arr[i].getInfo() + "\n");
              // 정보가 나열된 값이 쌓인다.
          }
        }	// end of for----------
        if(isSearch) {	// 같은 값이 있다면.
        	title();
            System.out.println(sb.toString());
        // 쌓아둔 값을 문자열로 출력한다.
        } else { // 없을 경우
        	System.out.println("[검색결과 성별 " 
            + input_gender + "자 구직자는 없습니다.]");
        }	// end of if~else-----
    }	// end of if~else---------------
}	// end of void search_gender(sc, gu_arr)-----
// @@@@@@ 구직자의 성별 구하기 (Gujikja class) @@@@@@@@@@
String getGender() { 
	if("1".equals(jubun.substring(6))
    	|| "3".equals(jubun.substring(6)))
    	return "남";
    else
    	return "여";
}	// end of String getGender()-------------
###########################################################
// @@@@@@ 연령대 및 성별 검색 @@@@@@@@@@
void search_ageLine_gender(Scanner sc, Gujikja[] gu_arr) {
	if(Gujikja.count == 0) {	// 구직자가 없을 경우
    	System.out.println
        		(">> 구직자로 가입된 회원이 없습니다.\n");
    } else{	// 구직자가 있는 경우
    	StringBuilder sb = new StringBuilder();
        String str_ageLine = "";
        String str_gender = "";
        boolean isUse_ageLine_gender = false;
        boolean isSearch = false;
        
        outer:
        do{
        	System.out.println("0~80 대까지 입력 가능합니다.");
        	System.out.print
            	("▷ 검색하고자 하는 연령대 [예 : 20] => ");
            str_ageLine = sc.nextLine();
            switch(str_ageLine) {
            case "0" : 
            case "10" :
            case "20" :
            case "30" :
            case "40" :
            case "50" :
            case "60" :
            case "70" :
            case "80" :
            	isUse_ageLine_gender = true;
                break;
            default :
            	System.out.println
                ("[경고] 올바른 연령대를 입력하세요\n");
                break outer;
            }	// end of switch(str_ageLine)-------
            for(int i=0; i<Gujikja.count; i++) {
            	int ageLine = gu_arr[i].getAge()/10*10;
                if(Integer.parseInt(str_ageLine) == ageLine)
                {isSearch = true;
                break;
                }
            }	// end of for--------
            if(!isSearch) {
            	System.out.println("[검색결과 연령대 " 
            + str_ageLine + "대인 구직자는 없습니다.]");
            break outer;
        }
        
        do{
          System.out.print
          		("▷ 검색하고자 하는 성별 [남/여] => ");
          str_gender = sc.nextLine();
          switch (str_gender.trim()) {
          case "남" :
          case "여" :
          	isUse_ageLine_gender = true;
            str_gender = str_gender.trim();
            break;
          default :
          	System.out.println
            	("[경고] \"남\" 또는 \"여\"만 입력하세요!\n");
                isUse_ageLine_gender = false;
          }	// end of switch(str_gender.trim())--------
          }	while(!isUse_ageLine_gender);
          do{
          isSearch = false;
          for(int i=0; i<Gujikja.count; i++) {
          	if(str_gender.equals(gu_arr[i].getGender())) {
            // 검색하고자 한 성별이 같다면,
            	isSearch = true;
                sb.append(gu_arr[i].getInfo() + "\n");
                //정보가 나열된 값이 쌓인다.
            }
           }	// end of for-----------
           if(isSearch) {	// 같은 값이 있다면
           		title();
              	System.out.println(sb.toString());
                // 쌓아둔 값을 문자열로 출력한다.
           } else {	// 없을 경우
           		System.out.println("[검색결과 " 
            	+ str_gender + "자 구직자는 없습니다.]");
           }	// end of if~else-------
        } while(!isSearch);	// end of do~while----
        // 연령대는 있지만 성별이 없는 사항을 선택할 때
        // 성별만 다시 선택할 수 있게 설정하였다.
        } while(!isUse_ageLine_gender);	// end of do~while--
    }	// end of if~else------------
}	// end of void search_ageLine_gender(sc, gu_arr)-------

정리

my.day11.c.abstraction -> Gujikja, Ctrl_gujikja, Main_gujikja

0개의 댓글

관련 채용 정보