Main
CRUD
C -> Create : 생성, 추가
R -> Read : 검색
U -> Update : 수정
D -> Delete : 삭제DAO - CRUD를 수행하는 class
D -> Data
A -> Access
O -> Object
DTO - Data를 담는 object
D -> Data
T -> Transfer
O -> Object
Data
데이터 저장 및 불러오기
package main;
import java.util.Scanner;
import dao.AddressDao;
public class MainClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
AddressDao dao = new AddressDao();
boolean end = false;
// menu
//out : while(true) {
while(true) {
System.out.println(" << 주소록 >> ");
System.out.println("1. 지인추가");
System.out.println("2. 지인삭제");
System.out.println("3. 지인검색");
System.out.println("4. 지인수정");
System.out.println("5. 모두출력");
System.out.println("6. 데이터저장");
System.out.println("7. 종료");
System.out.print(" >> ");
int choice = sc.nextInt();
switch(choice) {
case 1:
dao.insert();
break;
case 2:
dao.delete();
break;
case 3:
dao.select();
break;
case 4:
dao.update();
break;
case 5:
dao.allDatePrint();
break;
case 6:
dao.filesave();
break;
case 7:
end = true;
//프로그램을 종료하라는 뜻 사용할 때 조심해야함, 프로세스가 다 종료되어버릴 수 있음. 강제종료와 같음
//System.exit(0);
break; //break out; while 앞에 out 붙인 뒤 이렇게도 종료 가능
default:
}
if(end) {
System.out.println("프로그램을 종료합니다");
break;
}
}
}
}
package dao;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import data.FileProc;
import dto.HumanDto;
// Data Access Object
// 데이터를 접근하고 편집하는 object
public class AddressDao {
Scanner sc = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 변수를 100개 생성
private HumanDto humanArr[] = new HumanDto[100];
private int count;
private FileProc fileProc = null; // composition
public AddressDao() {
fileProc = new FileProc("address");
fileload();
/*// 테스트 데이터
humanArr[0] = new HumanDto("홍길동", 24, "123-4567", "서울시", "절친");
humanArr[1] = new HumanDto("성춘향", 16, "343-4547", "서울시", "절친");
humanArr[2] = new HumanDto("일지매", 20, "479-4557", "서울시", "절친");
humanArr[3] = new HumanDto("홍길동", 22, "178-4566", "서울시", "절친");
*/
/*
// 변수들에 객체를 생성
for (int i = 0; i < humanArr.length; i++) {
humanArr[i] = new HumanDto();
}
*/
//데이터를 새로 읽었을 때 배열의 할당되지 않은 공간을 검색한다
int nextcount = 0;
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null) {
nextcount++;
}
}
count = nextcount;
}
//추가, 삭제, 검색, 수정
public void insert() {
System.out.println("지인을 추가합니다");
System.out.print("이름 = ");
String name = sc.next();
System.out.print("나이 = ");
int age = sc.nextInt();
System.out.print("전화번호 = ");
String phone = sc.next();
System.out.print("주소 = ");
String address = "";
try {
address = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.print("메모 = ");
String memo = sc.next();
/*
humanArr[0].setName(name);
humanArr[0].setAge(age);
humanArr[0].setPhone(phone);
humanArr[0].setAddress(address);
humanArr[0].setMemo(memo);
*/
//변수들에 객체 생성을 안했을 때는 이렇게 바로 가능
humanArr[count] = new HumanDto(name, age, phone, address, memo);
count++;
}// end of insert
public void delete() {
System.out.print("삭제할 지인의 이름 = ");
String name = sc.next();
// 검색
int index = search(name);
/*
int index = -1;
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && name.equals(humanArr[i].getName())) {
index = i;
break;
}
}
*/
if(index == -1) {
System.out.println("지인의 정보를 찾을 수 없습니다");
}
else {
//삭제
humanArr[index].setName("");
humanArr[index].setAge(0);
humanArr[index].setPhone("");
humanArr[index].setAddress("");
humanArr[index].setMemo("");
System.out.println("지정한 지인을 삭제하였습니다");
}
}// end of delete
public void select() { //동명이인을 찾는다
// 검색
System.out.print("검색할 지인의 이름 = ");
String name = sc.next();
/*
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && name.equals(humanArr[i].getName())) {
System.out.println(humanArr[i].toString());
}else {
System.out.println("지인의 정보를 찾을 수 없습니다");
}
}
*/
// 찾을 사람이 몇명인지?
int count = 0;
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && name.equals(humanArr[i].getName())) {
count++;
}
}
if(count < 1) {
System.out.println("검색한 지인을 찾을 수 없습니다.");
return;
}
int n = 0;
HumanDto hdto[] = new HumanDto[count];
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && name.equals(humanArr[i].getName())) {
hdto[n] = humanArr[i];
n++;
}
}
//찾은 데이터의 배열
for (int i = 0; i < hdto.length; i++) {
System.out.println(hdto[i].toString());
}
}// end of select
public void update() {
System.out.print("수정할 지인의 이름 = ");
String name = sc.next();
// 검색
int index = search(name);
if(index == -1) {
System.out.println("지인의 정보를 찾을 수 없습니다");
return;
}
//update
System.out.println("데이터를 찾았습니다");
int ud;
System.out.print("수정할 지인의 정보(phone(1)/address(2)) >>");
ud = sc.nextInt();
if(ud == 1) {
System.out.print("수정할 지인의 전화번호를 입력하세요");
humanArr[index].setPhone(sc.next());
}else if(ud == 2) {
System.out.print("수정할 지인의 주소 입력하세요");
try {
humanArr[index].setAddress(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.print("지인의 정보가 수정되었습니다.");
}// end of update
//내부에서만 사용하는 함수로 private여도 상관없음. public이어도 됨.
private int search(String name) {
int index = -1;
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && name.equals(humanArr[i].getName())) {
index = i;
break;
}
}
return index;
}
public void allDatePrint() {
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && humanArr[i].getName().equals("") == false) {
System.out.println(humanArr[i].toString());
}
}
}// end of allDatePring
public void filesave() {
// 실제 배열에 들어있는 데이터
int count = 0;
for (int i = 0; i < humanArr.length; i++) {
//생성된 객체를 검사 삭제한 데이터 검사
if(humanArr[i] != null && !humanArr[i].getName().equals("")) {
count++;
}
}
String dataArr[] = new String[count];
/*
이름나이전화번호주소메모
이름*나이*전화번호*주소*메모
*/
count = 0;
for (int i = 0; i < humanArr.length; i++) {
if(humanArr[i] != null && !humanArr[i].getName().equals("")) {
dataArr[count] = humanArr[i].toString();
count++;
}
}
fileProc.write(dataArr);
}
public void fileload () {
String datas[] = fileProc.read();
/*
for (String s : datas) {
System.out.println(s);
}
*/
for (int i = 0; i < datas.length; i++) {
String split[] = datas[i].split(":");
//split[0] -> 이름
//split[1] -> 나이
humanArr[i] = new HumanDto( split[0],
Integer.parseInt(split[1]),
split[2],
split[3],
split[4]);
}
}
}// end of AddressDao
package dto;
// Data Transfer Object : 쓰기, 읽기
// VO : Value Object : 읽기전용
// 주소록의 한명의 데이터를 담는 object
public class HumanDto {
// 사람의 정보 항목(column)
// 이름, 나이, 전화번호, 주소, 메모
private String name;
private int age;
private String phone;
private String address;
private String memo;
public HumanDto() {
}
//Source -> Generate Constructor using Fields...
public HumanDto(String name, int age, String phone, String address, String memo) {
super();
this.name = name;
this.age = age;
this.phone = phone;
this.address = address;
this.memo = memo;
}
//Source -> Generate Setters and Getters...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
//Source -> Generate toString (출력을 확인하는 용도)
@Override
public String toString() {
return name + ":" + age + ":" + phone + ":" + address + ":"+ memo;
}
}
package data;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
// 파일 쓰기, 읽기
public class FileProc {
private File file = null;
public FileProc(String filename) {
file = new File("/Users/ksy/tmp//" + filename + ".txt");
try {
if(file.createNewFile()) {
System.out.println("파일 생성 성공!");
}else {
System.out.println("기존의 파일이 있습니다");
}
} catch (IOException e) {
e.printStackTrace();
}
}//end of FileProc(String filename)
public String[] read() {
String datas[] = null;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
// 데이터의 총 갯수를 구한다
int count = 0;
String str = "";
while((str = br.readLine()) != null) {
count++;
}
br.close();
// 배열 할당
datas = new String[count];
//파일로부터 배열에 저장
br = new BufferedReader(new FileReader(file)); //읽어서 아래로 내려간 포인터를 위로 올려주는 작업
int w = 0;
while ((str = br.readLine()) != null) {
datas[w] = str;
w++;
}
br.close();
//catch를 하나만 적고 Exception만 적어주면 모든 예외를 받아들임
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) { //while문의 br.readLine의 예외
e.printStackTrace();
}
return datas;
}//end of read
public void write(String datas[]) {
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
for (int i = 0; i < datas.length; i++) {
pw.println(datas[i]);
}
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("파일에 저장되었습니다");
}//end of write
}