유난스런 개발 기록

[JAVA] Day-12 _ 추상화 (abstraction) 본문

개념정리/JAVA

[JAVA] Day-12 _ 추상화 (abstraction)

yourhwan 2023. 1. 23. 21:37

day-12

추상화 (abstraction)


추상화 (abstraction) 란? 

  • 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술
  • 일반적인 의미의 추상화란 어떤 물체(object)에서 주된 특징을부각시켜 표현하고,
  • 나머지 부분은 과감하게 생략하는 것을 말한다.
  • 추객체지향 프로그래밍(OPP)에서 사용 되는 추상화도 이와 비슷하다.
  • 어떤 하나의 물체를 대표하는 속성(멤버변수 등)과 기능(메소드)를 추출해내는 것
  • 이것을 객체지향 프로그래밍(OPP)에서 추상화(abstraction)라고 한다.

예를 들어, 구인구직 어플리케이션을 프로그래밍 할 때,

필요한 부품(요소) 중 하나인 "구직자"에 대해서 알아보자.

 

"구직자"가 가지고 있는 속성과 행동양식을 뽑아내면,

속성(property, attribute, field)은 멤버변수가 되고,

행동양식(기능)은 메소드가 되는 것이다.

 

Gujikja 라는 클래스를 생성했다면,

속성(property, attribute, field) : 아이디, 암호, 성명, 연락처, 이메일, 주소, 학력, 희망구직직종, 희망연봉...

행동양식(기능, 메소드) : 구직자로 접속(로그인)할수 있는 기능, 구직자정보를 조회해주는 기능, 구직자정보를 변경해주는 기능...

 

이렇게 나타낼 수 있다. 아무래도 자세한 이해를 위해서는 코드가 필요하다.

수업시간에 실습을 진행했던 코드를 첨부한다.

총 3개의 클래스를 생성했다.

 

메인 클래스

package my.day12.abstraction;

import java.util.Scanner;

public class Gujikja_main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		GujikjaCtrl ctrl = new GujikjaCtrl();
		
		Gujikja[] guArr = new Gujikja[5];
		
      /////////////////////////////////////////////////////
		Gujikja gu1 = new Gujikja();
		gu1.userid = "eomjh";
		gu1.passwd = "qWer1234$A";
		gu1.name = "엄정화";
		gu1.jubun = "9501172";
		guArr[Gujikja.count++] = gu1;
		
		Gujikja gu2 = new Gujikja();
		gu2.userid = "leess";
		gu2.passwd = "abCd123$B";
		gu2.name = "이순신";
		gu2.jubun = "0101173";
		guArr[Gujikja.count++] = gu2;
		
		Gujikja gu3 = new Gujikja();
		gu3.userid = "youks";
		gu3.passwd = "aSdf1234$C";
		gu3.name = "유관순";
		gu3.jubun = "8501172";
		guArr[Gujikja.count++] = gu3;
		
      /////////////////////////////////////////////////////	
		
		String smenuNo = "";
		do {
			ctrl.main_menu(); // 메인메뉴 보여주기
			smenuNo = sc.nextLine();
			
			switch (smenuNo) {
				case "1": // 구직자 회원가입
					ctrl.register(sc, guArr); // 회원가입을 위한 메소드 호출. 입력받은 값을 생성 되어진 배열 속에 넣는다.
					break;
					
				case "2": // 구직자 모두 보기
					ctrl.showAll_Info(guArr);
					break;
					
				case "3": // 검색
					ctrl.search_menu(sc, guArr);
					break;
					
				case "4": // 프로그램 종료
					
					break;				
		
				default:  // 메뉴번호에 없는 값 
					System.out.println(">> [경고] 선택하신 번호는 메뉴에 없습니다. << \n");  
					break;
			}// end of switch(smenuNo)-------------------------
		
		} while( !("4".equals(smenuNo)) );
		// end of do~while------------------------------
		
		
		sc.close();
		
		System.out.println("\n~~~~~ 프로그램 종료 ~~~~~");

	}// end of main()-----------------------------------
	
	
	

}

 

구직자 클래스

package my.day12.abstraction;

import java.text.SimpleDateFormat;

public class Gujikja {

// field(속성) 생성
	 String userid; 		// 아이디
	 String passwd; 		// 비밀번호
	 String name; 			// 성명
	 String jubun; 			// 주민번호 앞의 7자리 까지만
	 						// 예: "9512201" 남자  "0112203 남자 
	 						// 예: "9512202" 여자  "0112204 여자 
	String register_day;	// 가입일자
	 
	 static int count; // Gujikja 객체(instance)의 개수를 알아오려는 용도

	 // 기본생성자
	 public Gujikja() {
		 
		 Date now = new Date(); // 현재시각
		 SimpleDateFormat sdfmt = new SimpleDateFormat("yyyy=MM-dd HH;mm:ss");
		 register_day = sdfmt.format(now);
	 }
	 
	 // method 생성
	 
	 // === 구직자의 성별을 알려주는 메소드 생성하기 ===
	 String getGender() {
		 
		 String gender = "";
		 
		 
		 switch (jubun.substring(6)) {
		case "1":
		case "3":	
			gender = "남";
			break;

		default:
			gender = "여";
			break;
		}// end of switch()------------------------------
		 
		 return gender;
	 }// end of  String getGender()
	 
	 
	 // === 구직작의 현재 나이를 알려주는 메소드 생성하기 ===
	 
	 int getAge() {
		 
		 // 현재 나이 = 현재년도 - 태어난년도 +1;
		 Calendar currentDate = Calendar.getInstance(); // 현재 날짜와 시간을 얻어온자.
		 int currentYear = currentDate.get(Calendar.YEAR); // 2023
		 
		 int centry = ( "1".equals( jubun.substring(6) ) || "2".equals( jubun.substring(6) ) )?1900:2000;
		 
		 int birthYear = Integer.parseInt(jubun.substring(0, 2)) + centry;
		 // 태어난 년도
		 
		return currentYear - birthYear + 1;
		 
		 
	 }// end of int getAge()
	 
	 
	 // === 구직자의 정보를 한줄로 리턴시켜주는 메소드 생성하기 ===
	 String getInfo() {
	 
		 //  eomjh   qWer*****    엄정화   여      29		2023-01-17 15:30:20
	
		 StringBuilder sb = new StringBuilder();
		 sb.append(userid+"\t");
		 
		 String star = "";
		 for(int i=0; i<passwd.length()-4; i++) {
			 star += "*";
			 
		 }
		 
		 sb.append(passwd.substring(0, 4) + star + "\t");
		 
		 sb.append(name+"\t");
		 sb.append(getGender()+"\t");
		 sb.append(getAge()+"\t");
		 sb.append(register_day);
		 
		 return sb.toString();
		 
	 }// end of tring getInfo()---------------------------------
	
	
	
}

 

구직자 컨트롤

package my.day12.abstraction;

import java.util.Scanner;

import my.util.MyUtil;

public class GujikjaCtrl {

	// == 메인 메뉴를 보여주는 메소드 생성하기 == //
	void main_menu() {
		System.out.println("\n=== 메인메뉴 === \n"
		               + " 1.구직자 회원가입  2.구직자 모두 보기  3.검색  4.프로그램 종료 \n"); 

		System.out.print("▷ 메뉴번호 선택 => ");
	}

	// == 구직자(Gujikja) 신규 회원가입시
	//    Gujikja 클래스의 field 의 요구사항에 모두 맞으면
	//    Gujikja[] guArr 에 저장시켜주는 메소드 생성하기 ==
	void register(Scanner sc, Gujikja[] guArr) {
		
		if( Gujikja.count < guArr.length ) {
			
			String userid;
			String passwd;
			String name;
			String jubun;
			
			// 아이디는 필수 입력사항이면서 중복된 아이디로 입력하면 안된다.!!
			// 입력받은 아이디가 중복된 아이디가 아닐때 까지 반복해야 한다.
			boolean isUseID;
			
			do {
				isUseID = true;
				
				System.out.print("1. 아이디 : ");
				userid = sc.nextLine(); // "eomjh" "leess"  "youks"
				                        // "hongkd"
				                        // ""  
				                        // "          "
				
				// == 가입된 회원들에 대해 중복아이디 검사하기 == //
				if( !userid.trim().isEmpty() ) {
					for(int i=0; i<Gujikja.count; i++) {
						if( userid.equals(guArr[i].userid) ) {
							System.out.println(">> 이미 사용중인 아이디 입니다. << \n"); 
							isUseID = false;
							break;
						}
					}// end of for---------------------------
				}
				
				else { // "" 또는 "          "
					System.out.println(">> 아이디는 필수 입력사항 입니다. << \n"); 
					isUseID = false;
				}
				
			} while (!isUseID);
			// end of do~while-------------------------
			
			
			// 비밀번호는 필수 입력사항이면서 비밀번호 조건에 맞을때 까지 반복해야 한다.
			boolean isUsePasswd;
			
			do {
				isUsePasswd = true;
				
				System.out.print("2. 비밀번호 : ");
				passwd = sc.nextLine(); // "qW12$" "qwer1234$"  
				                        // "qWer1234$"
				
				// 비밀번호 조건에 맞는지 아닌지를 검사한다.
				if( !MyUtil.isCheckPasswd(passwd) ) {
					System.out.println(">> [경고] 비밀번호는 8글자 이상 15글자 이하의 대,소문자,숫자,특수기호가 혼합되어야만 합니다. \n"); 
					isUsePasswd = false;
				}
				
			} while (!isUsePasswd);
			// end of do~while-------------------------
			
			
			// 성명은 필수 입력사항이므로 그냥 엔터나 공백만으로 된것이 아닐때 까지 반복해야 한다.
			boolean isUseName;
			
			do {
				isUseName = true;
				
				System.out.print("3. 성명 : ");
				name = sc.nextLine(); // ""  "         "  
				                      // "홍길동"
				
				// 입력받은 성명이 그냥 엔터인지 또는 공백만으로 이루져 있는지를 검사한다.
				if( name.trim().isEmpty() ) {
					System.out.println(">> [경고] 성명은 공백만으로 된것이 아닌 데이터를 입력해야 합니다. \n"); 
					isUseName = false;
				}
				
			} while (!isUseName);
			// end of do~while-------------------------
			
			
			// 주민번호는 필수 입력사항이면서 주민번호 조건에 맞을때 까지 반복해야 한다.
			boolean isUseJubun;
			
			do {
				isUseJubun = true;
				
				System.out.print("4. 주민번호 : ");
				jubun = sc.nextLine(); // "95abcd1" "9513562"  "9501179" ==> 꽝!!  
				                       // "9501171" "9501172"  "0101173"  "0201174" ==> 정상   
				
				// 주민번호 조건에 맞는지 아닌지를 검사한다.
				if( !MyUtil.isCheckJubun(jubun) ) {
					System.out.println(">> [경고] 올바른 주민번호를 입력하세요!! \n"); 
					isUseJubun = false;
				}
				
			} while (!isUseJubun);
			// end of do~while-------------------------
			
			
			Gujikja gu = new Gujikja();
			gu.userid = userid;
			gu.passwd = passwd;
			gu.name = name;
			gu.jubun = jubun;
			
			guArr[Gujikja.count++] = gu;
			
			System.out.println(">> 구직자 회원가입 성공!! << \n");
			
		}
		
		else {
			System.out.println(">> 정원 "+ guArr.length +"명이 초과하여 구직자 회원가입이 불가합니다.!! << \n"); 
		}
	}// end of void register(Scanner sc, Gujikja[] guArr)---------

	
	
	// == 검색 메뉴를 보여주는 메소드 생성하기 == //
	 void search_menu(Scanner sc, Gujikja[] guArr) {
		 
		 
		 String str_menuo = "";
		 
		do {	
			 System.out.println("\n=== 검색메뉴 === \n"
		               + " 1.연령대 검색  2.성별 검색  3.연령대 및 성별  4.메인메뉴로 돌아가기 \n"); 
	
			System.out.print("▷ 메뉴번호 선택 => ");
				 
			str_menuo = sc.nextLine();
			
			switch (str_menuo) {
			case "1": // 연령대검색
				search_ageLine(sc, guArr);
				break;
				
			case "2": // 성별 검색
				search_gender(sc ,guArr);
				break;
					
			case "3": // 연령대 및 성별
				search_ageLine_gender(sc, guArr);
				break;
				
			case "4": // 메인메뉴로 돌아가기
				
				break;
		
			default:
				System.out.println(">> [경고] 검색메뉴에 존재하는 번호만 입력하세요!! << \n");
				break;
		}// end of switch()-------------------------
	 } while( !("4".equals(str_menuo)) );
		 
	 
		 
		}// end of  void search_menu(Scanner sc, Gujikja[] guArr)
	
	
	 // === 성별을 검색하는 메소드 생성 == //
	 void search_gender(Scanner sc, Gujikja[] guArr) {
		
		 System.out.print("► 검색하고자 하는 성별 [남/여]: ");
			String input_gender = sc.nextLine(); // "남" "여" "남 " "여 " => 정상
						   						//  "강아지" => 꽝
			input_gender = input_gender.trim();
			
			if("남".equals(input_gender) || "여".equals(input_gender)) {// 입력받은 값에 좌우측 공백이 있을 수 있으니 trim()으로 공백 제거
			
			
			}
			else { // "남" 또는 "여" 가 아닌 "강아지" 와 같은 것을 입력한 경우
				System.out.println("[경고] \"남\" 또는 \"여\" 만 입력하세요!! \n");
			}
			
				StringBuilder sb = new StringBuilder();
				int count = 0;
				
				for(int i=0; i < Gujikja.count; i ++) {
					
				if(input_gender.equals(guArr[i].getGender())) {
					
					sb.append(guArr[i].getInfo()+"\n");
					count++;
				}
				
				}// end of for()--------------------
				
				if(count == 0) {
					System.out.println("[검색결과] "+input_gender+"자 구직자는 없습니다.\n");
				}
				else {
					title();
					System.out.println(sb.toString()); // getInfo()를 보여준다
					System.out.println("[검색려과] "+input_gender+"자 구직자는 "+count+"명입니다.");
				}
				
	
				
		}// end of void search_gender(Scanner sc, Gujikja[] guArr)--------------------------
		 
	 
	// === 구직자 모두보기 메소드 ===
	void showAll_Info(Gujikja[] guArr) {
		
	/*
	     ---------------------------------------------------
	      아이디    비밀번호       성명    성별    현재나이   가입일자
	     ---------------------------------------------------
	      eomjh   qWer*****    엄정화   여      27           
	      leess   abCd******   이순신   남      31           
	      chaew   aSdf*****    차은우   남      22           
	*/
		
		if( Gujikja.count == 0 ) {
			System.out.println(">> 구직자로 가입된 회원이 아무도 없습니다. << \n"); 
		}
		
		else {
			title();
			StringBuilder sb = new StringBuilder();
			
			for(int i=0; i<Gujikja.count; i++) {
				sb.append(guArr[i].getInfo()+"\n");
			}// end of for----------------------
			
			System.out.println(sb.toString());
		}
		
		
	}// end of void showAll_info(Gujikja[] guArr)--------------- 
	
	
	void title() {
		System.out.println("====================================================================\n"
				         + "  아이디    비밀번호  	 성명   성별     현재나이   		가입일자 \n"
				         + "====================================================================");
		
	}// end of void title()----------------------------

	// == 연령대 검색해주는 메소드 == //
	
	void search_ageLine(Scanner sc, Gujikja[] guArr) {
		
		System.out.print("► 검색하고자 하는 연령대 : ");
		String str_ageLine = sc.nextLine(); // "20" "30" "40" => 정상
					   						// "=20" "강아지" => 꽝
		
		int search_ageLine = 0;
		try {
			search_ageLine = Integer.parseInt(str_ageLine);
			
			if(search_ageLine < 0) {
				System.out.println(">> [경고] 올바른 연령대를 입력하세요!! << \n");
				return; // search_ageLine(Scanner sc, Gujikja[] guArr) 메소드가 종료
				
			}
			
		} catch(NumberFormatException e) {
			System.out.println(">> [경고] 올바른 연령대를 입력하세요!! << \n");
			return; // search_ageLine(Scanner sc, Gujikja[] guArr) 메소드가 종료
		}
			
			StringBuilder sb = new StringBuilder();
			int count = 0;
			
			for(int i=0; i < Gujikja.count; i ++) {
				
				guArr[i].getAge(); // 나이 		27				22			31			39
								   // 연령대	  27/10*10		22/10*10	21/10*10	29/10*10
								   //	 		 20				20			30			30	
			
			int age_Line = guArr[i].getAge()/10*10;
			
			if(search_ageLine == age_Line) {
				sb.append(guArr[i].getInfo()+"\n");
				count++;
			}
			
			}// end of for()--------------------
			
			if(count == 0) {
				System.out.println("[검색결과] "+search_ageLine+"대 구직자는 없습니다.\n");
			}
			else {
				title();
				System.out.println(sb.toString());
				System.out.println("[검색려과] "+search_ageLine+"대 구직자는 "+count+"명입니다.");
			}
		
	}// end of void search_ageLine(Scanner sc, Gujikja[] guArr)--------------------------
	
	
	// === 연령대 및 성별 검색해주는 메소드 ===//
	void search_ageLine_gender(Scanner sc, Gujikja[] guArr) {
		
		
		System.out.print("► 검색하고자 하는 연령대 : ");
		String str_ageLine = sc.nextLine(); 
		
		int search_ageLine = 0;
		try {
			search_ageLine = Integer.parseInt(str_ageLine);
			
			if(search_ageLine < 0) {
				System.out.println(">> [경고] 올바른 연령대를 입력하세요!! << \n");
				return; // search_ageLine(Scanner sc, Gujikja[] guArr) 메소드가 종료
				
			}
			
		} catch(NumberFormatException e) {
			System.out.println(">> [경고] 올바른 연령대를 입력하세요!! << \n");
			return; // search_ageLine(Scanner sc, Gujikja[] guArr) 메소드가 종료
		}
		
		
		 System.out.print("► 검색하고자 하는 성별 [남/여]: ");
			String input_gender = sc.nextLine(); // "남" "여" "남 " "여 " => 정상
						   						//  "강아지" => 꽝
			input_gender = input_gender.trim();
		
			if( !("남".equals(input_gender) || "여".equals(input_gender)) ) {
				System.out.println("[경고] \"남\" 또는 \"여\" 만 입력하세요!! \n");
				return; // search_ageLine_gender(Scanner sc, Gujikja[] guArr) 메소드가 종료
			}
			
			StringBuilder sb = new StringBuilder();
			int count = 0;
			for(int i=0; i<Gujikja.count; i++) {
				
				int ageLine = guArr[i].getAge()/10*10; // 연령대
				
				if( search_ageLine == ageLine &&
				    input_gender.equals(guArr[i].getGender()) ) {
					sb.append(guArr[i].getInfo()+"\n");
					count++;
				}
				
			}// end of for()---------------------------------------
			
			if(count == 0) {
				System.out.println("[검색결과] "+search_ageLine+"대 "+input_gender+"자 구직자는 없습니다.\n");
			}
			else {
				title();
				System.out.println(sb.toString());
				System.out.println("[검색결과] "+search_ageLine+"대 "+input_gender+"자는 "+count+"명 입니다.\n");
			}
			
			
			
			
	}// end of void search_ageLine_gender(Scanner sc, Gujikja[] guArr)
	
	
	
	
	
}

 

사실 공부를 하며 가장 가려웠던 부분은 "생성자"에 대한 개념과 이해다.

책과 온라인 상의 무료 강의들을 봐도 속 시원하게 궁금증이 해결되지 않는다 ㅜㅜ...

 

대충 느낌만 알기엔 너무 답답한 부분이라 확실하게 알고 넘어가고싶다...

공부를 더 해보고 나중에 이어질 포스팅에 생성자에 대해 다시 다뤄야겠다.

 

할 수 있다 화이팅 ^^...