JAVA 프로그래밍

[JAVA] 풀스택 개발자 부트캠프 010일차 ② 학생 관리 프로그램(불러오기, 저장하기 추가)

selfdailycoding 2025. 1. 7. 13:39


main.MainClass

package main;

import dao.StudentDao;

import java.util.Scanner;

public class MainClass {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // menu
        StudentDao dao = new StudentDao();

        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 menu = sc.nextInt();

            switch (menu){
                case 1:
                    dao.insert();
                    break;
                case 2:
                    dao.delete();
                    break;
                case 3:
                    dao.select();
                    break;
                case 4:
                    dao.update();
                    break;
                case 5:
                    dao.print();
                    break;
                case 6:
                    dao.dataLoad();
                    break;
                case 7:
                    dao.dataSave();
                    break;
            }
        }
    }
}








dao.StudentDao

package dao;

import dto.StudentDto;
import file.FileClass;

import java.util.Arrays;
import java.util.Scanner;

// Data Access Object
public class StudentDao {
    // CRUD
    private Scanner sc;

    private StudentDto[] students;
    private int count;

    private FileClass fc;

    public StudentDao() {
        sc = new Scanner(System.in);

        students = new StudentDto[10];

        fc = new FileClass();
        fc.create();

        count = 0;

        //students[0] = new StudentDto(1, "홍길동", 171.2, "서울시");
        //students[1] = new StudentDto(2, "성춘향", 157.3, "남원시");
        //students[2] = new StudentDto(3, "일지매", 180.1, "부산시");
    }

    public void insert(){   // 추가
        System.out.println("학생추가 >>>" );
        System.out.print("번호 = ");
        int number = sc.nextInt();

        System.out.print("이름 = ");
        String name = sc.next();

        System.out.print("키 = ");
        double height = sc.nextDouble();

        System.out.print("주소 = ");
        String address = sc.next();

        StudentDto dto = new StudentDto(number, name, height, address);
        students[count] = dto;
        count++;
    }

    public void delete(){   // 삭제
        System.out.println("학생삭제 >>>" );
        System.out.print("학생명 = ");
        String name = sc.next();

        // 검색
        // index를 찾아서 삭제하는 방법
        int index = -1;
        index = search(name);
        /*for (int i = 0;i < students.length; i++){
            StudentDto dto = students[i];
            if(dto != null && name.equals(dto.getName())){
                index = i;
                break;
            }
        }*/

        // 삭제
        if(index == -1){
            System.out.println("학생정보를 찾을 수 없습니다");
            return;
        }
        students[index] = null;


        /*
        StudentDto dto = null;
        for (StudentDto st : students){
            if(st != null && name.equals(st.getName())){
                dto = st;
            }
        }

        if(dto == null){
            System.out.println("학생정보를 찾을 수 없습니다");
            return;
        }

        for (int i = 0;i < students.length; i++){
            if(dto == students[i]){
                students[i] = null;
                break;
            }
        }*/

        System.out.println("학생데이터를 삭제하였습니다");
    }

    public void select(){   // 검색
        System.out.println("학생검색 >>>" );
        System.out.print("학생명 = ");
        String name = sc.next();

        int index = search(name);

        if(index == -1){
            System.out.println("학생정보를 찾을 수 없습니다");
            return;
        }

        System.out.println("학생정보입니다 >> ");
        System.out.println(students[index].toString());
    }

    public void update(){   // 수정
        System.out.println("학생정보수정 >>>" );
        System.out.print("학생명 = ");
        String name = sc.next();

        int index = search(name);
        if(index == -1){
            System.out.println("학생정보를 찾을 수 없습니다");
            return;
        }

        System.out.println("학생정보입니다 >> ");
        System.out.println(students[index].toString());

        System.out.print("수정할 주소를 입력 = ");
        String address = sc.next();

        students[index].setAddress(address);
        System.out.println("수정되었습니다");
    }

    public int search(String name){
        int index = -1;
        for (int i = 0;i < students.length; i++){
            StudentDto dto = students[i];
            if(dto != null && name.equals(dto.getName())){
                index = i;
                break;
            }
        }
        return index;
    }

    public void print(){
        for (int i = 0;i < students.length; i++){
            StudentDto st = students[i];
            if(st != null) {
                System.out.println(st.toString());
            }
        }
    }

    public void dataLoad(){
        String datas[] = fc.load();

        /*for (String data : datas){
            System.out.println(data);
        }*/
        // datas[0] = "1-홍길동-171.2-서울시"

        for(int i = 0;i < datas.length; i++) {
            String[] data = datas[i].split("-");
            int number = Integer.parseInt(data[0]);     // 1
            String name = data[1];                      // 홍길동
            double height = Double.parseDouble(data[2]);    // 171.2
            String address = data[3];                   // 서울시

            StudentDto st = new StudentDto(number, name, height, address);
            students[i] = st;
        }

        count = datas.length;
    }

    public void dataSave(){
        String datas[] = new String[10];

        //for (int i = 0;i < datas.length; i++) datas[i] = "";

        int len = 0;
        for(int i = 0;i < students.length; i++){
            StudentDto dto = students[i];
            if(dto != null){    // 1-홍길동-171.2-서울시
                datas[len] = dto.getNumber() + "-" + dto.getName() + "-" + dto.getHeight() + "-" + dto.getAddress();
                len++;
            }
        }
        System.out.println(Arrays.toString(datas));

        fc.save(datas);
    }

}
/*
    MyClass cls = null;

    // 객체를 할당
    cls = new MyClass();

    // 배열만 생성
    MyClass arr[] = new MyClass[3];     arr[0], arr[1], arr[2]

    // 객체를 할당
    arr[0] = new MyClass();
    arr[1] = new MyClass();
    arr[2] = new MyClass();

    arr[0].setName("홍길동");

 */

dto.StudentDto

package dto;

// Data Transfer Object
public class StudentDto {

    private int number;
    private String name;
    private double height;
    private String address;

    public StudentDto() {
    }

    public StudentDto(int number, String name, double height, String address) {
        this.number = number;
        this.name = name;
        this.height = height;
        this.address = address;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "StudentDto{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", height=" + height +
                ", address='" + address + '\'' +
                '}';
    }
}

file.FileClass

package file;

import dto.StudentDto;

import java.io.*;

public class FileClass {

    private File file;

    public FileClass() {
        file = new File("g:\\tmp\\students.txt");
    }
    public void create(){ // 파일
        try {
            if(file.createNewFile()){
                System.out.println("파일 생성 성공!");
            }else{
                System.out.println("같은 파일명이 존재합니다");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public String[] load(){ // getter 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의 배열을 할당
            datas = new String[count];

            // 데이터를 파일로부터 저장
            br = new BufferedReader(new FileReader(file));
            int len = 0;
            while((str = br.readLine()) != null){
                datas[len] = str;
                len++;
            }
            br.close();

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return datas;
    }

    public void save(String[] datas){ // setter write
        // 1-홍길동-171.2-서울시  [0]        row
        // 2-성춘향-159.3-남원시  [1]
        try {
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));

            for (String s : datas){
                if(s != null) {
                    pw.println(s);
                }
            }
            pw.close();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


}