[Java] 주소록만들기(AddressBook)

Young eee·2022년 12월 29일

Java

목록 보기
17/22
post-thumbnail

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
데이터 저장 및 불러오기

MainClass

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;
			}
			
		}
		
	}

}

AddressDao

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

HumanDto

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;
	}
	
}

FileProc

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
}

0개의 댓글