Java Day 22 CMS 완성
05 Jan 2021 | JavaJava Day 22 CMS 완성
- 들어가며
이제 기능적인 부분들을 구현하여 최종 완성을 한다. 기능은 완성본 사진으로 설명.
- 완성본
주민등록번호 유효성 검사로 올바른 주민등록번호 등록시 등록에 성공한다.
테스트를 위해 111111-1111011 테스트용 주민등록번호를 사용했다.
유효성 검사에 통과하지 못하면 등록에 실패한다.
리스트의 항목을 누르면 해당 인물의 신상정보가 화면에 표시되고 이때 수정이 가능한 전화번호와 취미를 제외한 나머지 항목은 잠긴다. 마찬가지로 등록 버튼 이외의 버튼은 활성화가 된다.
분석 버튼을 누르면 주민등록번호를 분석하여 관련 정보를 화면에 출력한다.
수정 버튼을 누르면 전화번호와 취미를 수정할 수 있다. 다시 항목을 누르면 수정이 반영된 결과를 볼 수 있다.
삭제 버튼을 누르면 해당 인물의 객체가 삭제되고 리스트에서 사라진다. 이때 등록 버튼은 다시 활성화되고 나머지 버튼은 잠긴다. 텍스트필드도 초기화된다.
지우기 버튼은 객체는 삭제하지 않고 화면만 초기화한다. 입력모드로 바꾸는 버튼이다.
File 메뉴의 Save 메뉴 클릭시 파일을 저장 할 수 있으며 Save As는 다른 이름으로 저장이 가능하다.
New로 프로그램을 초기화한 뒤 불러오기를 하면 다시 화면에 출력이 가능하다.
- 소스코드
/*
Freinds Class
*/
package lim.java.homework;
import java.io.Serializable;
public class Friends implements Serializable{
//멤버필드
private static final long serialVersionUID = 1L;
private String name;
private String birth;
private String age;
private String sex;
private String address;
private String tel;
private Boolean[] hobby;
private String id;
//생성자
public Friends(String id, String name, String birth, String age, String sex, String address, String tel, Boolean[] hobby) {
this.name = name;
this.birth = birth;
this.age = age;
this.sex = sex;
this.address = address;
this.tel = tel;
this.hobby = hobby;
this.id = id;
}
//메소드
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public Boolean[] getHobby() {
return hobby;
}
public void setHobby(Boolean[] hobby) {
this.hobby = hobby;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/*
Day 21 CMS - GUI편에 이어서 계속..
FreindManager Class
*/
public void setEvent() {// 이벤트 걸기
tf_frontId.addKeyListener(this);
tf_backId.addKeyListener(this);
choice_tel.addItemListener(this);
list.addItemListener(this);
for (int i = 0; i < btn_arr.length; i++) {
btn_arr[i].addActionListener(this);
}
file_exit.addActionListener(this);
help_ver.addActionListener(this);
file_new.addActionListener(this);
file_save.addActionListener(this);
file_load.addActionListener(this);
file_saveAs.addActionListener(this);
}
public void setMod() {// 버튼 활성/비활성
for (int j = 0; j < btn_arr.length; j++) {
if (j == 0) {
btn_arr[j].setEnabled(!mod);
} else {
btn_arr[j].setEnabled(mod);
}
}
}
public void initForm() {// 화면 초기화
tf_name.setText("");
tf_frontId.setText("");
tf_backId.setText("");
tf_frontTel.setText("");
tf_backTel.setText("");
cb_group.setSelectedCheckbox(cb_male);
for (int i = 0; i < hobby_arr.length; i++) {
hobby_arr[i].setState(false);
}
choice_tel.select(0);
choice_tel.select(0);
tf_name.setEditable(true);
tf_frontId.setEditable(true);
tf_backId.setEditable(true);
cb_male.setEnabled(true);
cb_female.setEnabled(true);
mod = false;
}
@Override
public void actionPerformed(ActionEvent e) {//Action
for (int i = 0; i < btn_arr.length; i++) {
if (e.getSource() == btn_arr[i]) {
btn_selected = i;
button_event();
}
}
setMod();
// 나가기
if (e.getSource() == file_exit) {
System.exit(0);
}
// 버전 정보
if (e.getSource() == help_ver) {
Point pt = getLocation();
Dimension main_size = getSize();
Dimension dial_size = d.getSize();
d.setLocation((int) pt.getX() + main_size.width / 2 - dial_size.width / 2,
(int) pt.getY() + main_size.height / 2 - dial_size.height / 2);
setDialog();
}
// 새 파일
if (e.getSource() == file_new) {
friend.clear();
list.removeAll();
myFile = null;
mod = false;
}
// 저장하기
if (e.getSource() == file_save) {
if(myFile == null) {
fileDialog = new FileDialog(this, "저장하기", FileDialog.SAVE);
fileDialog.setVisible(true);
String fileName = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(fileName == null || directory == null) {
return;
}
myFile = new File(directory, fileName);
}
saveObj();
}
// 불러오기
if (e.getSource() == file_load) {
fileDialog = new FileDialog(this, "불러오기", FileDialog.LOAD);
fileDialog.setVisible(true);
String fileName = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(fileName == null || directory == null) {
return;
}
myFile = new File(directory, fileName);
loadObj();
}
// 새 이름으로 저장하기
if (e.getSource() == file_saveAs) {
fileDialog = new FileDialog(this, "새 이름으로 저장하기", FileDialog.SAVE);
fileDialog.setVisible(true);
String fileName = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(fileName == null || directory == null) {
return;
}
myFile = new File(directory, fileName);
saveObj();
}
}
public void saveObj() {//데이터 저장
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(myFile);
oos = new ObjectOutputStream(fos);
for(int i=0; i<friend.size(); i++) {
Friends myFriend = friend.get(i);
oos.writeObject(myFriend);
}
ta_analysis.setText("\n\t성공적으로 저장되었습니다.");
} catch(FileNotFoundException fnfe) {
System.err.println(myFile.getName()+"파일이 존재하지 않습니다.");
} catch(IOException ioe) {
ioe.printStackTrace();
} finally {
try { if(oos != null) oos.close(); } catch(IOException ioe) {}
try { if(fos != null) fos.close(); } catch(IOException ioe) {}
}
}
public void loadObj() {//데이터 불러오기
FileInputStream fis = null;
ObjectInputStream ois = null;
list.removeAll();
friend.clear();
try {
fis = new FileInputStream(myFile);
ois = new ObjectInputStream(fis);
Friends myFriend = null;
while((myFriend = (Friends)ois.readObject()) != null) {
list.add(myFriend.getName());
friend.add(myFriend);
}
ta_analysis.setText("\n\t성공적으로 불러왔습니다.");
} catch(EOFException eofe) {
ta_analysis.setText("데이터 로딩이 완료되었습니다.");
} catch(FileNotFoundException e) {
System.err.println(myFile.getName()+"파일이 존재하지 않습니다.");
} catch(IOException ioe) {
ioe.printStackTrace();
} catch(ClassNotFoundException cnfe) {
System.err.println("관리자에게 문의하세요.");
}finally {
try { if(ois != null) ois.close(); } catch(IOException ioe) {}
try { if(fis != null) fis.close(); } catch(IOException ioe) {}
}
}
public void make_info() {// 신상정보 구하기
// 이름 구하기
name = tf_name.getText();
// 생년월일 구하기
year = 1900;
switch ((int) (id.charAt(6) - 48)) {
case '3':
case '4':
year = 2000;
break;
case '9':
case '0':
year = 1800;
break;
default:
year = 1900;
break;
}
year += (int) (id.charAt(0) - 48) * 10 + (int) (id.charAt(1) - 48);
int month = (int) (id.charAt(2) - 48) * 10 + (int) (id.charAt(3) - 48);
int day = (int) (id.charAt(4) - 48) * 10 + (int) (id.charAt(5) - 48);
birth = String.valueOf(year) + "년 " + String.valueOf(month) + "월 " + String.valueOf(day) + "일";
// 성별 구하기
sex = (int) (id.charAt(6) - 48) % 2 == 0 ? "여성" : "남성";
// 나이 구하기
age = String.valueOf(Calendar.getInstance().get(Calendar.YEAR) - year) + "세";
// 출생 구하기
String[] where = { "서울", "경기", "강원", "충북", "충남", "전북", "전남", "경북", "경남", "제주" };
address = where[(int) (id.charAt(7) - 48)] + "지역";
}
public void button_event() {// 버튼 이벤트
int index = list.getSelectedIndex();
switch (btn_selected) {
case 0:
// 데이터 입력 안받고 등록 버튼 눌렀을때
if (tf_name.getText().isEmpty() || tf_frontId.getText().isEmpty() || tf_backId.getText().isEmpty()
|| tf_frontTel.getText().isEmpty() || tf_backTel.getText().isEmpty()) {
ta_analysis.setText("입력을 해주세요");
return;
} else {
id = tf_frontId.getText() + tf_backId.getText();
tel = choice_tel.getSelectedItem()+tf_frontTel.getText() + tf_backTel.getText();
for (int i = 0; i < hobby_arr.length; i++) {
hobby[i] = hobby_arr[i].getState();
}
// 주민 유효성 검사
int id_total = 0;
int id_multi = 2;
float temp = 0;
double hap = 0;
for (int i = 0; i < id.length() - 1; i++) {
id_total += ((int) (id.charAt(i) - 48) * id_multi);
id_multi++;
if (id_multi == 10)
id_multi = 2;
}
temp = 11.f * (int) (id_total / 11.f) + 11.f - id_total;
hap = temp - 10.f * (int) (temp / 10.f);
if (hap != (int) (id.charAt(id.length() - 1) - 48)) {
ta_analysis.setText("경고 : 올바르지 않은 주민등록번호입니다.");
return;
}
make_info();
// 리스트에 추가
list.add(name);
ta_analysis.setText(name + "님이 성공적으로 등록되었습니다.");
friend.add(new Friends(id, name, birth, age, sex, address, tel, hobby));
initForm();
}
break;
case 1:
ta_analysis.setText("\n\t이름 : " + friend.get(index).getName() + "\n\t생년 : " + friend.get(index).getBirth()
+ "\n\t나이 : " + friend.get(index).getAge() + "\n\t성별 : " + friend.get(index).getSex() + "\n\t출생 : "
+ friend.get(index).getAddress());
break;
case 2:
String newTel = choice_tel.getSelectedItem()+tf_frontTel.getText() + tf_backTel.getText();
friend.get(index).setTel(newTel);
Boolean[] newHobby = new Boolean[5];
for (int i = 0; i < hobby_arr.length; i++) {
newHobby[i] = hobby_arr[i].getState();
}
friend.get(index).setHobby(newHobby);
ta_analysis.setText(friend.get(index).getName() + "님의 정보가 성공적으로 수정되었습니다.");
break;
case 3:
ta_analysis.setText(friend.get(index).getName() + "님의 정보가 삭제되었습니다.");
friend.remove(index);
list.remove(index);
initForm();
break;
case 4:
initForm();
ta_analysis.setText("");
break;
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
if (e.getSource() == tf_frontId) {
if (tf_frontId.getText().trim().length() == 6) {
tf_backId.requestFocus();
return;
}
} else if (e.getSource() == tf_backId) {
if (tf_backId.getText().trim().length() == 7) {
choice_tel.requestFocus();
return;
}
}
}
@Override
public void itemStateChanged(ItemEvent e) {
//전화번호 통신사 선택시 다음 칸으로 focus
if (e.getSource() == choice_tel) {
tf_frontTel.requestFocus();
return;
}
if (e.getSource() == list) {
// 리스트 항목 클릭시 화면 표시
tf_name.setEditable(false);
tf_frontId.setEditable(false);
tf_backId.setEditable(false);
cb_male.setEnabled(false);
cb_female.setEnabled(false);
int index = list.getSelectedIndex();
tf_name.setText(friend.get(index).getName());
tf_frontId.setText(friend.get(index).getId().substring(0,6));
tf_backId.setText(friend.get(index).getId().substring(6));
choice_tel.select(friend.get(index).getTel().substring(0,3));
tf_frontTel.setText(friend.get(index).getTel().substring(3,7));
tf_backTel.setText(friend.get(index).getTel().substring(7));
if (friend.get(index).getSex().equals("남성")) {
cb_group.setSelectedCheckbox(cb_male);
} else if (friend.get(index).getSex().equals("여성")) {
cb_group.setSelectedCheckbox(cb_female);
}
if (e.getStateChange() == 1) {
for (int i = 0; i < hobby_arr.length; i++) {
hobby_arr[i].setState(friend.get(index).getHobby()[i]);
}
}
// 버튼 활성화
mod = true;
setMod();
}
}
public static void main(String[] args) {
new FirendManager();
}
}
setEvent() 메소드에 각 버튼들에 이벤트를 거는 기능을 구현했다.
주민번호 6자리를 입력하면 다음 칸으로 이동하며 뒷자리 7자리를 입력하면 전화번호 통신사 선택 choice로 focus가 이동된다.
등록 버튼과 다른 버튼들이 번갈아가면서 활성화되도록 boolean mod 변수를 선언하고 setMod() 메소드로 mod의 값이 바뀔때마다 버튼의 활성화가 바뀌는 기능을 구현했다.
for문으로 각 버튼을 순회하며 선택된 버튼값이 담길 변수에 값을 저장하고 이 변수로 switch문에서 해당 버튼의 기능들을 구현했다.
boolean 배열에 취미 checkbox의 선택된 항목을 저장하였다.
Object스트림으로 객체의 정보를 파일에 작성하고 읽어오는 기능을 구현했다.
마치며
학원에서 배운 내용들이지만 그 배운 내용들을 응용하여 스스로 무언가를 만들었다는 점이 뿌듯하게 느껴졌다. 이제 주제도 스스로 정하고 구조를 짜고 순서도를 작성하여 구현하는 연습을 해야겠다. 다음 java project 포스팅은 개인 프로젝트 때 일려나?