개발자
[java 15일차] get,set/캡슐화/ctrl,Main,Gujikja 클래스의 관계 본문
캡슐화
1
2
3
4
5
6
7
8
9
10
|
/*
------------------------------------------------------------------------------------------------------------------------------------------------
접근제한자(접근지정자, accessmodifier) 자기자신클래스내부 동일패키지에있는다른클래스 다른패키지에있는하위(자식)클래스 그외의영역
---------------------------------------------------------------------------------------------------------------------------------------------------
public O O O O o
protected O O O X X
default O O X X //아무값도 안써준거 x
private O X X X x
*/
|
cs |
get, set
모든 프로그램이 그렇겠지만 외부로부터 변수값에 직접적으로 접근하는 것을 막고있습니다.직접 접근하게 되면 무결성이 깨질 수 있기 때문입니다. 자바에서는 함수를 통해 값을 전달받고, 전달하고 방식을 권장하고 있습니다.또한 클래스 내에서 변수는 private(캡슐화, 정보은닉)로 선언하여 외부에서 바라볼 수 없도록 해야 합니다.
get,set 사용해야하는 이유 참고 블로그 : (꼭보기)
[JAVA] 자바 SET, GET 를 사용하는 이유와 예제
객체 지향 프로그램 SET, GET 메소드에서 갑자기 왠 객체 지향 프로그램이냐구요? 모든 프로그램이 그렇겠지만 외부로부터 변수값에 직접적으로 접근하는 것을 막고있습니다. 직접 접근하게 되면
mozi.tistory.com
<Gujikja 클래스>
: 구직자클래스에서객체를 private으로 만들어주었고, get,set 메소드를 사용하여 접근하도록 했다. set메소드에 유효성검사를 넣어서 코드의 무결성을 보정할 수 있도록 만든것이다. <14일차와의 차이점>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
private String userid; // 아이디
private String passwd; // 비밀번호
private String name; // 성명
private String jubun; // 주민번호인데 앞자리6자리에 성별을 나타내는 1자리까지만 입력한다.
// 예: "9506201" "9607202" "0006203" "0106204" "1106204"
private String register_day; // 가입일자 private는 이 클래스에서만 쓰이게 한다.
static int count; // Gujikja 객체(인스턴스)의 개수를 알아로려는 용도
//기본 생성자
public Gujikja() {
Date now = new Date(); // 현재시각
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// System.out.println("오늘날짜 : " + df.format(now));
register_day = df.format(now);
}
// method 생성
public void setUserid(String userid) { // get : 값을 읽어들인다 / set : 값을 넣어준다 캡슐화
if(userid != null && !userid.trim().isEmpty() ) { // 이걸 만족해야 넣어준다
this.userid = userid;
}
else {
System.out.println("[경고] 아이디는 공백이 아닌 글자로 입력하셔야 합니다.\n");
}
}
public String getUserid() {
return userid;
}
public String getPasswd() { //이 조건을 만족해야 불러온다
if(passwd == null)
return passwd;
else {
String str_star = "";
for(int i=0; i<passwd.length()-4; i++) {
str_star += "*";
}//end of for----------------------------------------
return passwd.substring(0, 4) + str_star;
}
}
public void setPasswd(String passwd) {
if ( MyUtil.checkPwd(passwd) ) {
this.passwd = passwd;
}
else {
System.out.println("[경고] 비밀번호는 8글자 이상 15글자 이하의 대,소문자,숫자,특수기호가 혼합되어야만 합니다.");
}
}
public String getName() {
return name;
}
public void setName(String name) { // get : 값을 읽어들인다 / set : 값을 넣어준다 >>>>>>>파일 받기
// name 에는 한글만 허용하겠다.
if (name == null) {
System.out.println("[경고] 성명은 공백이 아닌 글자로 입력하셔야 합니다.\n");
}
else {
//정규표현식(Regular Expression)이란?
// ==> 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어
// == 1. 정규표현식(Regular Expression) 패턴을 작성한다. == //
Pattern p = Pattern.compile("^[가-힣]{2,5}$");
//"[^0-9]" ^ 대괄호속에 들어가면 부정이라는뜻 "^[^0-9]" 바깥에 ^있으면 시작을 의미한다.
//$는 끝이라는 의미. 가-힣 는 한글의 처음과 끝이라는 뜻
//[] 는 글자1개가 들어오는 것을 의미한다.
//{2,5} 은 반복되어지는 회수는 말하는데 2번 또는 3번 4번 5번 까지를 허용한다는 말한다.
// == 2. 문자열이 주어진 정규식 패턴과 일치하는지 판별하는 객체를 생성한다. == //
Matcher m = p.matcher(name);
// == 3. 판별하도록 한다. == //
boolean b = m.matches();
if(b) {
this.name = name;
}
else {
System.out.println(">>성명은 공백없이 한글로만 2글자 부터 5글자 이내로만 가능합니다. <<\n");
}
}
/*
if(userid != null && !userid.trim().isEmpty() ) {
this.name = name;
}
else {
System.out.println("[경고] 아이디는 공백이 아닌 글자로 입력하셔야 합니다.\n");
}
*/
}
public String getJubun() {
return jubun;
}
public void setJubun(String jubun) {
if(MyUtil.checkjubun(jubun)) {
this.jubun = jubun;
}
else {
System.out.println("[경고] 주민번호를 올바르게 넣으세요\n 예>9510202 \n");
}
}
public String getRegister_day() {
return register_day;
}
/*
public void setRegister_day(String register_day) {
this.register_day = register_day;
} 이건 다른값 넣어주면 안되서 만들면 안된다.
*/
// == 구직자의 나이를 알려주는 메소드 생성하기 ==
int getAge() {
// 현재나이 = 현재년도 - 태어난년도 + 1
Calendar currentDate = Calendar.getInstance(); // 현재날짜와 시간을 얻어온다.
int currentYear = currentDate.get(Calendar.YEAR); // 현재년도 2022
int centry = ( Integer.parseInt(jubun.substring(6)) == 1 || Integer.parseInt(jubun.substring(6)) == 2 )?1900:2000;
int birthYear = Integer.parseInt(jubun.substring(0, 2)) + centry; // 태어난년도
return currentYear - birthYear + 1;
}
// == 구직자의 성별을 알려주는 메소드 생성하기 ==
String getGender() {
String gender = "";
switch (jubun.substring(6)) {
case "1":
case "3":
gender = "남";
break;
default:
gender = "여";
break;
}
return gender;
}
// == 구직자의 정보를 한줄로 출력해주는 메소드 생성하기 ==
String getInfo() {
//eomjj qWer***** 엄정화 여 27
StringBuilder sb = new StringBuilder();
sb.append(userid+"\t"); //append는 다쌓아준다
String str_star ="";
for(int i=0; i< passwd.length() - 4; i++) {
str_star += "*";
}
sb.append(passwd.substring(0, 4) + str_star +"\t");
sb.append(name+"\t");
sb.append(getGender()+"\t");
sb.append(getAge()+"\t");
sb.append(register_day); //가입일자 넣어주기
return sb.toString();
}
|
cs |
<Ctrl 클래스>
14일차와 다르게 유효성검사의 제약조건이 Gujikja클래스에서 set메소드 안에서 이루어지므로 set메소드안에 값을 넣어주는 것만 하면된다. 차이점을 생각해보자
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
public class Ctrl_Gujikja {
// == Gujikja 객체를 Gujikja[] gu_arr 배열에 저장시키는 메소드 생성하기 == //
void save_gu_arr(Gujikja gu, Gujikja[] gu_arr) {
if (!(gu.getUserid()== null) &&
(gu.getPasswd()!= null) &&
(gu.getName()!= null) &&
(gu.getJubun()!= null)) {
gu_arr[Gujikja.count++] = gu; // 아이디 패스워드등이 null이 아니라면 여기에 넣어주겠다.
System.out.println("[구직자 회원으로 가입 성공함!!]\n");
}
else {
System.out.println("[구직자 회원 가입 실패함!!]\n");
}
}//end of void save_gu_arr(Gujikja gu, Gujikja[] gu_arr)----------
// == 메인 메뉴를 보여주는 메소드 생성하기 == //
void main_menu() {
System.out.println(" \n=== 메인메뉴 ===\n"
+ "1.구직자 회원가입 2.구직자 모두보기 3.검색 4.프로그램종료\n");
System.out.print("▷ 메뉴번호 선택 : ");
}
// == 검색메뉴를 보여주는 메소드 생성하기 == //
void search_menu(Scanner sc, Gujikja[] gu_arr) {
String str_menuno = "";
do {
System.out.println(" \n=== 검색메뉴 ===\n"
+ "1.연령대검색 2.성별검색 3.연령대 및 성별검색 4.메인메뉴로 돌아가기\n");
System.out.print("▷ 메뉴번호 선택 : ");
}// end of void search_menu(Scanner sc
=== 구직자(Gujikja) 신규 회원가입시 Gujikja 클래스의 field 의 요구사항에 모두 맞으면
// Gujikja[] gu_arr 에 저장시켜주는 메소드 생성하기 ===
void register(Scanner sc, Gujikja[] gu_arr) {
if(Gujikja.count < gu_arr.length) { //지금까지 생성된 구직자 회원수가 gu_arr.length(정원) 보다 적을 경우애만 신규회원을 받아들인다
// 아이디는 필수 입력사항이면서 중복된 아이디로 입력하면 안된다.!!
// 입력받은 아이디가 중복된 아이디가 아닐떄 까지 반복해야 한다.
String userid;
boolean isUseID; // 중복된게 있냐? 아직은 없다처음이니까
do {
isUseID= true;
System.out.print("1.아이디 : ");
userid = sc.nextLine(); // "eomjh" " "
// == 가입된 회원들에 대해 중복아이디 검사하기 == //
if( !userid.trim( ).isEmpty() ) {//입력된 값이 공백이아닐때만 검사한다
for(int i=0; i<Gujikja.count; i++) {
if( userid.equals(gu_arr[i].getUserid()) ) {
System.out.println(">> 이미 사용중인 아이디 입니다. <<\n"); // 검사해서 중복아이디있으면 계속 돌아간다
isUseID = false;
break;
}
}// end of for----------------------
}// end of for-------- first
else { // "" 또는 " "
isUseID = false; // 공백일때 false
}
} while (!isUseID); //탈출조건 true면 빠져나온다
//end of do~ while------------------------------------------
// 암호는 필수 입력사항이면서 암호조건에 맞을 때 반복해야 한다.
System.out.print("2.비밀번호 : ");
String passwd = sc.nextLine();
System.out.print("3.성명 : ");
String name = sc.nextLine();
System.out.print("4.주민번호 : ");
String jubun = sc.nextLine();
Gujikja gu = new Gujikja(); //set에서 다 검사해주니까 위에 do while문 필요없어진다.
gu.setUserid(userid);
gu.setPasswd(passwd);
gu.setName(name);
gu.setJubun(jubun);
save_gu_arr(gu, gu_arr);
/*gu_arr[Gujikja.count++] = gu; // 후위니까 gu에 넣어주고 한개 올라간다. 회원가입수 정원초과 봐야하니까
System.out.println(">> 구직자 회원가입 성공 <<");*/ // 위에 메소드로 만들어줬음
} // end of if first---------------------------------------------------
else { // 지금까지 생성된 구직자 회원수가 gu_arr.length(정원) 과 같거나 큰 경우에는 신규회원을 받아들이면 안된다.
System.out.println(">> 정원이 초과하여 구직자 회원가입이 불가합니다!! <<");
}
}//end of void register(Scanner sc, Gujikja[] gu_arr)------------------------
== 구직자 모두보기 메소드 ===
void showAll_info(Gujikja[] gu_arr) {
}//end of void showAll_info(Gujikja[] gu_arr)
=== 연령대 검색해주는 메소드 생성하기 === //해보기
void search_ageLine(Scanner sc, Gujikja[] gu_arr) {
}// end of void search_ageLine()--------------------------------------------
===성별 검색해주는 메소드====
void search_gender(Scanner sc, Gujikja[] gu_arr) {
// end of void search_gender(Scanner sc, Gujikja[] gu_arr)
== 연령대 및 성별 검색해주는 메소드 ==
void search_ageLine_gender(Scanner sc, Gujikja[] gu_arr) {
}// end of void search_ageLine_gender(Scanner sc, Gujikja[] gu_arr)
void title () {
System.out.println("=============================================================\n"
+" 아이디 비밀번호 성명 성별 현재나이 가입일자 \n"
+"============================================================\n");
}// end of void title()----------------------------------
} // end of class
|
cs |
<Main 클래스 동일>
'개발자 > JAVA' 카테고리의 다른 글
[JAVA 17일차]다중상속/다형성/상속성/instanceof/추상메소드(미완성메소드)/오버로딩,오버라이딩/block/ (0) | 2022.08.28 |
---|---|
[JAVA 16일차] (0) | 2022.08.27 |
[JAVA 14일차]구직자 나이구하기/성별구하기/객체지향프로그래밍/상속성,추상화,캡슐화,다형성/주민번호 유효성/ (0) | 2022.08.25 |
[JAVA 13일차] StringBuilder/reverse/replace/Date/Calendar/현재시각,어제시각,내일시각 (0) | 2022.08.25 |
[JAVA 12일차] 버블정렬/배열 오름,내림차순/Arrays.sort()/로또(lotto)/2차원배열 (0) | 2022.08.24 |