연락처 관리 프로그램 [ver.4.0]
연락처 관리 프로그램 ver.4.0
- 데이터 모델 : name, phone, email
- 기능 : 연락처 등록, 전체검색, 상세검색, 연락처 수정, 연락처 삭제
- UI 구조 :
0.종료 | 1. 등록 | 2.전체검색 | 3.상세검색 | 4.수정 | 5. 삭제
- 업그레이드 내용 : 연락처 등록/검색/수정/삭제 데이터를 datafile에 저장하기. int에 String 입력 시 예외처리하기
파일에 데이터를 저장할 땐 파일을 먼저 만들고 시작해야합니다. 프로그램이 실행되면서 저장하기위한 파일도 생성하면 되는데요, 이 프로그램은 시작하고 바로 인스턴스를 생성하기 때문에 생성자가 우선순위가 가장 높아요. 그래서 생성자에서 파일을 생성하도록 하겠습니다.
private ContactDAOImple() {
initDataDir();
initDataFile();
};
파일 저장을 사용했을 때의 흐름을 생각해볼까요? 데이터가 입력되면 데이터를 파일에 저장하고 데이터가 삭제되면 삭제처리가 된 데이터를 다시 파일에 저장합니다. 데이터를 검색하면 파일에 있는 데이터를 읽어오고 종료했을 땐 기존의 데이터가 유지되어야하기 때문에 다시 실행되었을 땐 기존의 데이터를 불러오면 됩니다
private void writeDataToFile() {
OutputStream out=null;
BufferedOutputStream bout=null;
ObjectOutputStream oout=null;
try {
out=new FileOutputStream(dataFile);
bout=new BufferedOutputStream(out);
oout=new ObjectOutputStream(bout);
oout.writeObject(list);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
oout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}//end writeDataToFile()
private void readDataFromFile() {
InputStream in=null;
BufferedInputStream bin=null;
ObjectInputStream oin=null;
try {
in=new FileInputStream(dataFile);
bin=new BufferedInputStream(in);
oin=new ObjectInputStream(bin);
list=(ArrayList<ContactVO>) oin.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}//end readDataFromFile()
오류 발생!
- 최초로 프로그램을 실행하고 데이터 저장없이 프로그램을 종료하면 다시 실행했을 때 에러가 발생했었어요. 데이터 파일은 생성되었지만 저장된 데이터가 아무것도 없었기 때문인데요.
private void initDataDir() {
dataDir=new File(DATA_DIR);
System.out.println("폴더 경로 : "+dataDir.getPath());
System.out.println("절대 경로 : "+dataDir.getAbsolutePath());
if(!dataDir.exists()) {
if(dataDir.mkdir()) {
System.out.println(">>폴더를 생성했습니다.");
}else {
System.out.println(">>폴더를 생성할 수 없습니다.");
}
}else {
System.out.println(">>폴더가 이미 존재합니다.");
}
}//end initDataDir()
private void initDataFile() {
String filePath=DATA_DIR+File.separator+DATA_FILE;
dataFile=new File(filePath);
System.out.println("파일 경로 : "+dataFile.getPath());
System.out.println("절대 경로 : "+dataFile.getAbsolutePath());
if(!dataFile.exists()) {
try {
if(dataFile.createNewFile()) {
System.out.println(">>새로운 데이터 파일을 생성했습니다.");
writeDataToFile();
// list가 비어있어도 file에 저장하기
}else {
System.out.println(">>파일을 생성할 수 없습니다.");
}
} catch (IOException e) {
e.printStackTrace();
}
}else {
System.out.println(">>기존 데이터가 존재합니다.");
readDataFromFile();
// 시작하기 전 데이터를 불러오기
}
}//end initDataFile()
writeDataToFile()
메소드의 위치를 list에 들어갈 데이터가 없어도 file이 생성되면서 list가 저장되도록 했더니 빈데이터가 들어간 다음에도 실행했을 경우 정상적으로 작동했음을 확인할 수 있었어요!
if(list==null) {
list = new ArrayList<ContactVO>();
}else {
readDataFromFile();
}
이 방식으로도 해봤었는데 안되는건 아니지만 코드 가독성이 떨어진다고 하셔서 아웃당했습니다.. 이렇게 배워가는거죠~🧐
그리고 새로운 데이터가 저장되어야하는 연락처 등록, 연락처 수정, 연락처 삭제 메소드에서 writeDataToFile()
를 호출하도록 하면 됩니다.
기존에는 int값을 입력받아 메뉴 선택 및 인덱스 입력을 받았는데요. 문자형 숫자가 입력될 경우도 숫자로 인식할수 있도록 Integer.parseInt(sc.nextLine())
로 입력받게 수정했으며
숫자가 아닌 다른 문자를 입력했을 경우 NumberFormatException
예외가 발생하는 모든 순간들을 try-catch로 예외처리해주었습니다.
향후 업데이트
UI를 콘솔화면이 아닌 gui로 제공하기
Author And Source
이 문제에 관하여(연락처 관리 프로그램 [ver.4.0]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeddoen/연락처-관리-프로그램-ver.4.0저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)