Cohe
고객 관리 프로그램 작성 본문
728x90
반응형
문제
- 고객의 정보를 입력해서 관리하는 프로그램, 고객의 정보는 이름, 성별, 이메일, 출생년도가 있습니다.
- 고객의 정보를 입력 받아 고객 객체에 저장하고, 고객 관리 프로그램은 고객의 정보를 리스트에 저장, 조회, 수정, 삭제할 수 있는 기능이 있습니다.
- 프로그램의 구동시 파일을 읽어 기존 정보를 얻은 채로 실행됩니다. 마찬가지로 파일에 데이터를 저장할 수 있어야 합니다. (객체 직렬화 사용, CustomerManager.txt 파일에 저장)
- 이름으로 개인 정보 조회, 수정, 삭제가 가능해야 하고, 이름으로 정보를 찾을 때 검색할 이름을 정확히 모를 경우에는 다시 메뉴로 보내줄 수 있도록 해당 메서드를 종료할 수 있는 기능이 있어야 합니다.
- 또한 전체 데이터를 출력할 수 있는 기능이 있어야 합니다.
- 여러분들이 원하시면 입력 시 이름과 이메일 중복 체크해 데이터를 검색하는 키인 이름에 중복이 들어가지 않게끔 걸러내는 기능도 추가해 주세요.
요구사항
- 고객 정보는 이름, 성별, 이메일, 출생년도를 저장하고, 이 고객 저장을 위한 객체를 생성하세요.
- 고객 정보의 자료는 이름은 문자열, 성별은 남(M), 여(F)로 저장, 이메일은 문자열로 저장, 마지막으로 태어난 연도는 양의 정수로 입력받게 저장하세요.
- 고객 객체는 리스트를 사용하여 저장합니다. (ArrayList 형식)
- 자바의 객체 직렬화를 이용하여 CusomerManager.txt 파일에 저장하세요.
- 이름을 이용하여 개인 정보 조회, 수정, 삭제가 가능하게 만들어주세요
- 다시 메뉴로 보내 줄 수 있게 종료 기능을 처리하세요.
- 입력시 이름과 이메일 중복 체크 데이터를 검색하여 중복 저장되지 않게하는 기능을 추가합니다.
풀이
Customer
1,2. 고객 정보는 이름, 성별, 이메일, 출생년도를 저장하고, 이 고객 저장을 위한 객체를 생성하세요 고객 정보의 자료는 이름은 문자열, 성별은 남(M), 여(F)로 저장, 이메일은 문자열로 저장, 마지막으로 태어난 연도는 양의 정수로 입력받게 저장하세요.
- 고객의 정보를 입력해서 관리하는 프로그램, 고객의 정보는 이름, 성별, 이메일, 출생년도가 있습니다.
- 또한 전체 데이터를 출력할 수 있는 기능이 있어야 합니다.
class Customer implements Serializable {
private static final long serialVersionUID = 1L;
String name;
String gender;
String email;
int birthYear;
Scanner s = new Scanner(System.in);
public Customer(){
this.birthYear = 2001;
this.name = "김철수";
this.email = "cjgtn@example.com";
this.gender = "F";
}
public Customer(String name, String gender, String email, int birthYear){
this.name = name;
this.email = email;
this.gender = gender;
this.birthYear = birthYear;
}
public String getEmail() {
return email;
}
public String getGender() {
return gender;
}
public String getName() {
return name;
}
public int getBirthYear() {
return birthYear;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setBirthYear(int birthYear) {
this.birthYear = birthYear;
}
public void isBirthDay(){
}
@Override
public String toString(){
return String.format("%d년도에 태어난 %s님의 성별은 %s이며, 이메일은 %s입니다.", birthYear, name, gender, email);
}
public String toCSV(){
return String.format("%d,%s,%s,%s", birthYear, name, gender, email);
}
}
CustomerManager
- 고객 객체는 리스트를 사용하여 저장합니다. (ArrayList 형식)
- 자바의 객체 직렬화를 이용하여 CusomerManager.txt 파일에 저장하세요.
- 이름을 이용하여 개인 정보 조회, 수정, 삭제가 가능하게 만들어주세요
- 다시 메뉴로 보내 줄 수 있게 종료 기능을 처리하세요.
- 입력시 이름과 이메일 중복 체크 데이터를 검색하여 중복 저장되지 않게하는 기능을 추가합니다.
- 고객의 정보를 입력 받아 고객 객체에 저장하고, 고객 관리 프로그램은 고객의 정보를 리스트에 저장, 조회, 수정, 삭제할 수 있는 기능이 있습니다.
- 프로그램의 구동시 파일을 읽어 기존 정보를 얻은 채로 실행됩니다. 마찬가지로 파일에 데이터를 저장할 수 있어야 합니다. (객체 직렬화 사용, CustomerManager.txt 파일에 저장)
- 이름으로 개인 정보 조회, 수정, 삭제가 가능해야 하고, 이름으로 정보를 찾을 때 검색할 이름을 정확히 모를 경우에는 다시 메뉴로 보내줄 수 있도록 해당 메서드를 종료할 수 있는 기능이 있어야 합니다.
- 여러분들이 원하시면 입력 시 이름과 이메일 중복 체크해 데이터를 검색하는 키인 이름에 중복이 들어가지 않게끔 걸러내는 기능도 추가해 주세요.
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
class CustomerManager implements Serializable {
static List<Customer> cusList = new ArrayList<>();
static transient Scanner s = new Scanner(System.in);
public static void main(String[] args) {
loadCustomerData();
while (true) {
//고객 메뉴 UI(Text UI)
System.out.printf("[INFO] 저장된 고객 수 : %d, \n", cusList.size());
System.out.println("메뉴를 입력하세요");
System.out.println("(I)nsert, (S)elect, (U)pdate, (D)elete, (A)ll print Customer (Q)uit");
System.out.print("메뉴 입력 : ");
String menu = s.next();
menu = menu.toUpperCase();//대소문자 구분을 안하기 위함
switch (menu.charAt(0)) {
case 'ㅑ':
case 'I':
insertCustomerData();
break;
case 'ㄴ':
case 'S':
selectCustomerData();
break;
case 'ㅕ':
case 'U':
Customer c = selectCustomerData();
updateCustomerData(c);
break;
case 'D':
c = selectCustomerData();
deleteCustomerData(c);
break;
case 'ㅂ':
case 'Q':
System.out.println("프로그램을 종료합니다.");
s.close();
writeCustomerData();
System.exit(0); //static 메소드임을 알려준다.
break;
case 'A':
case 'ㅁ':
printAllCustomerData();
break;
default:
System.out.println("잘못입력하셨어요, 다시 입력하세요");
break;
}
}
}
public static void insertCustomerData(){
System.out.println("등록 하고자 하는 이름을 작성해 주세요");
String name = s.next();
System.out.println("등록 하고자 하는 성별을 작성해 주세요");
String gender = s.next();
gender = isGender(gender.toUpperCase());
System.out.println("등록 하고자 하는 이메일을 작성해 주세요");
String email = s.next();
System.out.println("등록 하고자 하는 태어난년도를 작성해 주세요");
String birthYear = s.next();
int newbirthYear = isBirthYear(birthYear) ;
cusList.add(new Customer(name, gender, email, newbirthYear));
}
private static String isGender(String gender) {
if (!gender.equals("M") && !gender.equals("F")) {
System.out.println("잘못된 정보를 기입하였습니다. 재입력을 요청드립니다.");
gender = s.next();
return isGender(gender); // Return the validated gender
} else {
return gender; // Return the validated gender
}
}
private static int isBirthYear(String input) {
try {
int birthYear = Integer.parseInt(input);
if (birthYear <= 0 || birthYear >= 2024 || input == null) {
System.out.println("잘못된 생년월일을 입력하셨습니다. 다시 입력해주세요.");
input = s.next();
return isBirthYear(input); // Return the validated birth year
}
else return birthYear;
} catch (NumberFormatException e) {
System.out.println("숫자 형식이 아닙니다. 다시 입력해주세요.");
}
return 0;
}
public static Customer selectCustomerData() {
System.out.println("검색하고자 하는 이름을 작성해 주세요");
String key = s.next();
for (Customer value : cusList) {
if (value.getName() == null) {
continue;
}
if (value.getName().equals(key)) {
printCustomerData(value);
return value;
}
}
System.out.println("해당하는 고객이 없습니다.");
return null;
}
public static void printCustomerData(Customer c){
System.out.println(c.toString());
}
public static void printAllCustomerData(){
System.out.println("모든 고객의 데이터를 제공해 드리겠습니다.");
for (int i=0; i<cusList.size();i++) System.out.println(i+"번 째 저장 고객 데이터 : "+cusList.get(i).toString());
}
static void updateCustomerData(Customer c){
if(c == null){
c = selectCustomerData();
updateCustomerData(c);
}
else {
System.out.println("사용자의 이름을 재 입력하세요 (이전 값: " + c.getName() + "):");
String newName = s.nextLine();
if(newName.isEmpty()){
newName = c.getName();
}
System.out.println("사용자의 성별을 재입력하세요 (이전 값: " + c.getGender() + "):");
String newGender = s.nextLine();
if(newGender.isEmpty()){
newGender = c.getGender();
}
else {
newGender= newGender.toUpperCase();
newGender = isGender(newGender);
}
System.out.println("사용자의 이메일을 재입력하세요 (이전 값: " + c.getEmail() + "):");
String newEmail = s.nextLine();
if(newEmail.isEmpty()){
newEmail = c.getEmail();
}
System.out.println("사용자의 태어난 연도를 재 입력하세요. (이전 값: " + c.getBirthYear() + "):");
int birthYear;
String newBirthYear = s.next();
if(newBirthYear == null){
birthYear = c.getBirthYear();
}
else {
birthYear = isBirthYear(newBirthYear);
}
c.setName(newName);
c.setGender(newGender);
c.setEmail(newEmail);
c.setBirthYear(birthYear);
System.out.println("업데이트가 성공적으로 수행됐습니다.");
}
}
static void deleteCustomerData(Customer c){
if(c==null){
c = selectCustomerData();
deleteCustomerData(c);
}
else {
cusList.remove(c);
}
}
static void writeCustomerData() {
try (FileOutputStream fos = new FileOutputStream("CustomerManager.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(cusList);
System.out.println("고객 데이터가 저장되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
static void loadCustomerData() {
try (FileInputStream fis = new FileInputStream("CustomerManager.txt");
ObjectInputStream ois = new ObjectInputStream(fis)) {
cusList = (ArrayList<Customer>)ois.readObject();
System.out.println("고객 데이터를 파일에서 불러왔습니다.");
System.out.println(cusList);
} catch (IOException | ClassNotFoundException e) {
System.out.println("저장된 고객 데이터가 없습니다.");
}
}
}
힘들었던 점
- 아니 Customer 객체에 Scanner을 냅다 선언하고 못찾아서 2시간 해멤 미친놈인가 진짜;;
728x90
반응형
'개발 언어 > JAVA' 카테고리의 다른 글
18. JDBC (0) | 2024.04.01 |
---|---|
17. Network, 서버 만들기! (0) | 2024.03.28 |
16. ParallelStream, Thread (0) | 2024.03.27 |
15. Operator, Stream (0) | 2024.03.27 |
14 람다식 (0) | 2024.03.25 |