Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- super 생성자
- 상속
- 사용자 정의 예외처리
- 프로그래머스
- Java
- 백앤드
- 예외처리
- 알고리즘
- do~while문
- 생성자
- 추상화
- 부모 생성자
- 개발
- for문
- exception
- 취준생
- 비전공자
- 가위바위보프로그램
- 예외던지기
- 클래스의구조
- 자바
- Date Class
- 개발자
- AoutoBoxing
- 독학
- Calendar Class
- 코딩
- 국비지원
- 캐스팅연산자
- userDefineException
Archives
- Today
- Total
유난스런 개발 기록
[JAVA] Day-12 _ 추상화 (abstraction) 본문
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)
}
사실 공부를 하며 가장 가려웠던 부분은 "생성자"에 대한 개념과 이해다.
책과 온라인 상의 무료 강의들을 봐도 속 시원하게 궁금증이 해결되지 않는다 ㅜㅜ...
대충 느낌만 알기엔 너무 답답한 부분이라 확실하게 알고 넘어가고싶다...
공부를 더 해보고 나중에 이어질 포스팅에 생성자에 대해 다시 다뤄야겠다.
할 수 있다 화이팅 ^^...
'개념정리 > JAVA' 카테고리의 다른 글
[JAVA] Day-14 _ 상속성 (Inheritance) (0) | 2023.01.29 |
---|---|
[JAVA] Day-13 _ 캡슐화 (Encapsulation) (0) | 2023.01.29 |
[JAVA] Day-11 _ 캘린더 클래스와 데이트 클래스(Calendar Class & Date Class) (1) | 2023.01.23 |
[JAVA] Day-11 _ StringBuilder & StringBuilder (StringBuilder를 중심으로) (0) | 2023.01.23 |
[JAVA] Day-10 _ String 클래스 (String Class),(자주 사용하는 메소드 정리) (4) | 2023.01.22 |