Cohe

고객 관리 프로그램 작성 본문

개발 언어/JAVA

고객 관리 프로그램 작성

코헤0121 2024. 3. 31. 03:47
728x90

문제

  • 고객의 정보를 입력해서 관리하는 프로그램, 고객의 정보는 이름, 성별, 이메일, 출생년도가 있습니다.
  • 고객의 정보를 입력 받아 고객 객체에 저장하고, 고객 관리 프로그램은 고객의 정보를 리스트에 저장, 조회, 수정, 삭제할 수 있는 기능이 있습니다.
  • 프로그램의 구동시 파일을 읽어 기존 정보를 얻은 채로 실행됩니다. 마찬가지로 파일에 데이터를 저장할 수 있어야 합니다. (객체 직렬화 사용, CustomerManager.txt 파일에 저장)
  • 이름으로 개인 정보 조회, 수정, 삭제가 가능해야 하고, 이름으로 정보를 찾을 때 검색할 이름을 정확히 모를 경우에는 다시 메뉴로 보내줄 수 있도록 해당 메서드를 종료할 수 있는 기능이 있어야 합니다.
  • 또한 전체 데이터를 출력할 수 있는 기능이 있어야 합니다.
  • 여러분들이 원하시면 입력 시 이름과 이메일 중복 체크해 데이터를 검색하는 키인 이름에 중복이 들어가지 않게끔 걸러내는 기능도 추가해 주세요.

요구사항

  1. 고객 정보는 이름, 성별, 이메일, 출생년도를 저장하고, 이 고객 저장을 위한 객체를 생성하세요.
  2. 고객 정보의 자료는 이름은 문자열, 성별은 남(M), 여(F)로 저장, 이메일은 문자열로 저장, 마지막으로 태어난 연도는 양의 정수로 입력받게 저장하세요.
  3. 고객 객체는 리스트를 사용하여 저장합니다. (ArrayList 형식)
  4. 자바의 객체 직렬화를 이용하여 CusomerManager.txt 파일에 저장하세요.
  5. 이름을 이용하여 개인 정보 조회, 수정, 삭제가 가능하게 만들어주세요
  6. 다시 메뉴로 보내 줄 수 있게 종료 기능을 처리하세요.
  7. 입력시 이름과 이메일 중복 체크 데이터를 검색하여 중복 저장되지 않게하는 기능을 추가합니다.

풀이

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

  1. 고객 객체는 리스트를 사용하여 저장합니다. (ArrayList 형식)
  2. 자바의 객체 직렬화를 이용하여 CusomerManager.txt 파일에 저장하세요.
  3. 이름을 이용하여 개인 정보 조회, 수정, 삭제가 가능하게 만들어주세요
  4. 다시 메뉴로 보내 줄 수 있게 종료 기능을 처리하세요.
  5. 입력시 이름과 이메일 중복 체크 데이터를 검색하여 중복 저장되지 않게하는 기능을 추가합니다. 
  • 고객의 정보를 입력 받아 고객 객체에 저장하고, 고객 관리 프로그램은 고객의 정보를 리스트에 저장, 조회, 수정, 삭제할 수 있는 기능이 있습니다.
  • 프로그램의 구동시 파일을 읽어 기존 정보를 얻은 채로 실행됩니다. 마찬가지로 파일에 데이터를 저장할 수 있어야 합니다. (객체 직렬화 사용, 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시간 해멤 미친놈인가 진짜;;

'개발 언어 > 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