본문 바로가기

JAVA/국비 공부

3월18일 수업

package day0318;

import java.util.Scanner;
import day0317.Board;
import util.ScannerUtil;
import java.util.ArrayList;

//글의 제목이 아닌 번호로 객체를 컨트롤하는 버전의 BoardEx
public class BordEx01 {
    // Board 객체를 저장하고 관리할 ArrayList<Board> 객체
    private static ArrayList<Board> boardList = new ArrayList<>();
    // 키보드 입력을 처리해줄 Scanner 객체
    private static Scanner scanner = new Scanner(System.in);

    // 글 번호를 자동으로 넣어줄 때 사용될 int변수
    private static int currentId = 1;

    // 메인 메소드
    public static void main(String[] args) {
        showMenu();
    }

    // 메뉴를 보여주는 메소드
    private static void showMenu() {
        while (true) {
            System.out.println();
            System.out.println("=======================");
            System.out.println("    게시판 관리 프로그램    ");
            System.out.println("=======================");
            System.out.println();
            String message = new String("1. 글쓰기 2. 글 목록 보기 3. 종료");
            int userChoice = ScannerUtil.nextInt(scanner, message, 1, 3);

            if (userChoice == 1) {
                // 글 작성 담당 메소드 호출
                writeBoard();
            } else if (userChoice == 2) {
                // 글 목록 보기 담당 메소드 호출
                selectAll();
            } else if (userChoice == 3) {
                // 메세지 출력 후 종료
                System.out.println("사용해주셔서 감사합니다.");
                break;
            }

        }

    }

    // 글 작성을 담당하는 메소드
    private static void writeBoard() {
        // 정보를 담을 Board 객체 생성
        Board b = new Board();

        // 출력 메세지를 저장할 String 객체 message 선언
        String message;

        // Board 객체에 제목을 넣는다.
        message = new String(" 글의 제목을 입력해주세요");
        b.setTitle(ScannerUtil.nextLine(scanner, message));

        // 나머지 정보 입력
        // 전역 변수 currentId의 값을 넣고 currentIndex의 값을 1 증가시킨다.
        b.setId(currentId++);

        // 글의 작성자를 입력 받는다
        message = new String("글의 작성자를 입력해주세요.");
        b.setWriter(ScannerUtil.nextLine(scanner, message));

        // 글의 내용을 입력 받는다
        message = new String("글의 내용을 입력해주세요.");
        b.setContent(ScannerUtil.nextLine(scanner, message));

        // boardList Board 추가
        boardList.add(b);

    }

    // 글 목록보기를 담당하는 메소드
    private static void selectAll() {
        while (true) {
            // 만약 글이 boardList에 하나도 없을 시에는 메세지 출력후
            // break를 통해 무한루프를 종료시킨다.
            if (boardList.size() == 0) {
                System.out.println();
                System.out.println("아직 등록된 글이 없습니다.");
                System.out.println();
                break;
            }

            // for문을 통하여 list의 인덱스와 글 제목을 출력해 준다.
            System.out.println();

            for (int i = 0; i < boardList.size(); i++) {
                System.out.printf("%3d. %s \n", boardList.get(i).getId(), boardList.get(i).getTitle());
            }
            System.out.println();

            // 사용자로부터 개별 보기할 글의 인덱스나 혹은 뒤로가기를 선택하도록 입력 받는다.
            String message = new String("개별 보기할 글의 번호를 입력해주세요. 만약 메뉴로 가실려면 0을 입력해주세요");
            int userChoice = ScannerUtil.nextInt(scanner, message);

            // 사용자가 입력한 글의 id가 유효한 글의 id 인지 체크하고, 유효하지 않으면 유효한 id나 0 을 입력할 때 까지 다시 입력 받는다.

            // 글의 id가 유효한지를 체크하기 위해서, Board 객체를 하나 만들어서 그 안에 사용자가 입력한 id 값을 입력한다.(0이 아닐시)
            Board b = new Board();
            b.setId(userChoice);

            // while을 통해서 userChoice가 0이 아니고, b 가 boardList에 존재하지 않을 시에 다시 입력 받는다.
            while (!(userChoice == 0 || boardList.contains(b))) {
                System.out.println("해당 글 번호는 존재하지 않는 번호 입니다.");
                userChoice = ScannerUtil.nextInt(scanner, message);
                b.setId(userChoice);
            }
            // 뒤로 가기를 할 경우, break를 통해 showMenu() 메소드로 돌아가게 만들어준다.
            if (userChoice == 0) {
                break;

            } else {
                // 개별 보기를 할 경우 해당 메소드를 호출해 준다.
                selectOne(userChoice);
            }
        }
    }

    // 글 개별 보기를 담당하는 메소드
    private static void selectOne(int id) {
        // 사용자로부터 넘겨받은 id를 사용해서 우리 리스트에서 해당 id를 가지고 있는 Board 객체를 불러온다.

        // Board 객체를 하나 만든다.
        Board b = new Board();

        // Board 객체 b에 파라미터로 넘어온 id 값을 넣어준다.
        b.setId(id);

        // 우리가 Board.java의 equals() 메소드를 id 기준으로 해서 구현했으므로
        // 이제 indexOf() 메소드를 실행시키면, 지금 현재 id 값을 가진 객체의 id값이 나오게 된다.

        int index = findIndex(id);
        // 혹시라도 사용자가 유효한지 않은 id값을 넣을 경우를 대비해
        // index가 -1일 경우, 경고 메세지만 출력하고 그 외에는 원래대로의 작업을 하게 해준다.

        if (index == -1) {
            // 존재하지 않는 id 값이므로 경고메세지만 출력
            System.out.println();
            System.out.println(" 해당 글 번호는 존재하지 않는 번호 입니다.");
            System.out.println();

        } else {
            // 존재하는 id 값이므로, 추가 작업 실행

            // boardList의 index번에 저장된 객체의 printBoard() 메소드를 실행한다.
            boardList.get(index).printBoard();

            // 사용자에게 수정, 삭제, 뒤로가기 중 하나를 선택하도록 입력 받는다.
            String message = new String("1. 수정 2. 삭제 3. 뒤로가기");
            int userChoice = ScannerUtil.nextInt(scanner, message, 1, 3);

            if (userChoice == 1) {
                // 수정을 선택하면 update 메소드를 실행한다.
                update(id);

            } else if (userChoice == 2) {
                // 삭제를 선택하면 delete메소드를 실행해준다.
                delete(id);

            }
            // 뒤로가기를 선택하면 아무것도 안한다.
        }

    }

    // 글 수정을 담당하는 메소드
    private static void update(int id) {
        // 1. 파라미터로 넘어온 id 값을 사용하여 인덱스를 찾는다.
        int index = findIndex(id);

        // 2. 만약 index가 -1일 경우 해당 id가 존재하지 않으므로, 
        //    경고 메세지만 출력하고 그 외에는 수정을 진행한다.

        if (index == -1) {
            System.out.println();
            System.out.println("해당 글 번호는 존재하지 않는 번호입니다.");
            System.out.println();

        } else {
            // 글번호가 유효한 번호이므로 수정작업 시작

            String message = new String("글의 제목을 입력해주세요.");

            // 1. boardList의 index번 객체의 제목에 새로운 값을 저장한다.
            boardList.get(index).setTitle(ScannerUtil.nextLine(scanner, message));

            // 2. 그 외의 정보를 boardList의 index번 객체에 저장한다.
            message = new String("작성자를 수정해주세요.");
            boardList.get(index).setWriter(ScannerUtil.nextLine(scanner, message));

            message = new String("내용을 수정해주세요");
            boardList.get(index).setContent(ScannerUtil.nextLine(scanner, message));

            // 3. 다시 개별글 보기 메소드를 실행한다.
            selectOne(id);

        }
    }

    // 글 삭제를 담당하는 메소드
    private static void delete(int id) {
        // 1. 파라미터로 받은 id를 이용하여 index를 불러온다
        int index = findIndex(id);

        // 2. index가 -1일 경우 해당 글번호가 유효하지 않다는 의미이므로 
        //    경고메세지만 출력하고, 그 외에만 삭제를 진행한다.

        if (index == -1) {
            System.out.println();
            System.out.println("해당 글 번호는 존재하지 않는 번호입니다.");
            System.out.println();

        } else {
            // 글번호가 유효하므로 삭제 작업 진행
            
            // 1. 사용자로부터 정말 삭제할지 물어봐서 사용자로부터 입력을 받는다.
            String message = new String("정말로 삭제하시겠습니까? Y 혹은 y를 입력해주세요");
            String yesNo = ScannerUtil.nextLine(scanner, message);

            if (yesNo.equalsIgnoreCase("Y")) {
                // 2. 사용자가 대소문자 y를 입력했을 경우 해당 index를 삭제한다.
                // boardList의 remove(Index) 실행
                boardList.remove(index);
            } else {
                // 3. 그 외에 다른 글자를 입력했을 경우, selectOne(index)를 실행한다.
                selectOne(id);
            }

        }
    }

    private static int findIndex(int id) {
        int index = 0;

        // Board 객체를 하나 만든다
        Board b = new Board();

        // Board 객체 b에 파라미터로 넘어온 id 값을 넣어준다.
        b.setId(id);

        // 우리가 Board.java의 equals() 메소드를 id 기준으로 해서 구현했으므로
        // 이제 indexOf 메소드를 실행시키면, 지금 현재 id 값을 가진 객체의 index 값이 나오게 된다.

        index = boardList.indexOf(b);

        return index;
    }
}

'JAVA > 국비 공부' 카테고리의 다른 글

3월 18일 수업 2  (0) 2021.03.18
3월18일 수업 1  (0) 2021.03.18
3월 17일 수업 - 예제1)게시판 프로그램  (0) 2021.03.17
3월 17일 (예제)  (0) 2021.03.17
성적관리프로그램(3월17일)  (0) 2021.03.17