게시판 관리 App 만들기(1)

hyunn·2021년 7월 4일
0

Java-basic

목록 보기
12/26
post-thumbnail

01. main(): 프로그램 entry point

기본 프로그램 App.java 생성

public class App {
  public static void main(String[] args) {
    System.out.println("[게시판 관리]");
  }
}

Console
[게시판 관리]


02. 사용자로부터 명령어 입력 받기

java.util.Scanner 클래스 이용

import java.util.Scanner;

public class App {
  public static void main(String[] args) {
    System.out.println("[게시판 관리]");
    
    Scanner keyScan = new Scanner(System.in);
    
    System.out.print("명령> ");
    String command = keyScan.nextLine();
    System.out.println(command);
    
    keyScan.close();
  }
}

Console
[게시판 관리]
명령> App
App


03. 사용자로부터 계속 명령어 입력 받기

반복문을 사용해 명령어를 계속 입력받을 수 있도록 함
while문에 따로 break를 걸지 않아 단순히 입력만 받는 무한루프 형태

public class App {
  public static void main(String[] args) {
    System.out.println("[게시판 관리]");

    Scanner keyScan = new Scanner(System.in);

    while (true) {
      System.out.print("명령> ");
      String command = keyScan.nextLine();
      System.out.println(command);
    }
  }
}

Console
[게시판 관리]
명령> App
App
명령>
...


04. quit 명령어를 입력 받았을 때 반복 종료하기

"quit" 문자열을 입력받았을 때 break를 걸어 반복문을 종료할 수 있도록 함

...
    while (true) {
      System.out.print("명령> ");
      String command = keyScan.nextLine();

      if (command.equals("quit")) {
        break;
      }

      System.out.println(command);
    }

    keyScan.close();

    System.out.println("안녕히 가세요!");
  }
}

Console
[게시판 관리]
명령> App
App
명령> quit
안녕히 가세요!


05. 명령어 별로 실행을 분기하기

list, add, update, delete, view 명령을 추가
switch문으로 각 명령어가 입력되었을 때 실행이 분기될 수 있도록 설계
break문을 그냥 사용한다면 제일 가까운 switch문만 종료 -> 바깥의 while문에 label 설정

...
    loop: while (true) {
      System.out.print("명령> ");
      String command = keyScan.nextLine();

      switch (command) {
        case "list":
          System.out.println("[게시글 목록]");
          break;
        case "add":
          System.out.println("[게시글 등록]");
          break;
        case "update":
          System.out.println("[게시글 변경]");
          break;
        case "delete":
          System.out.println("[게시글 삭제]");
          break;
        case "view":
          System.out.println("[게시글 조회]");
          break;
        case "quit":
          break loop;
        default:
          System.out.println("지원하지 않는 명령입니다.");
      }
    }
...

Console
[게시판 관리]
명령> list
명령> add
명령> show
지원하지 않는 명령입니다.
명령> quit
안녕히 가세요!


06. 게시글 입력 받기

게시글 입력을 위해 입력파트인 add에 명령어 추가
keyScan으로 제목, 내용, 비밀번호를 입력받아 저장 후 출력

...
        case "add":
          System.out.println("[게시글 등록]");
          System.out.print("제목: ");
          String title = keyScan.nextLine();

          System.out.print("내용: ");
          String content = keyScan.nextLine();

          System.out.print("비밀번호: ");
          String password = keyScan.nextLine();

          System.out.printf("제목: %s\n", title);
          System.out.printf("내용: %s\n", content);
          System.out.printf("암호: %s\n", password);
          break;
...

Console
[게시판 관리]
명령> add
[게시글 등록]
제목: title
내용: content
비밀번호: passwd
제목: title
내용: content
암호: passwd
명령>


07. 배열을 이용하여 여러 개의 게시글 보관하기

위와 같은 코드는 하나의 게시글만 출력하고 종료
게시판의 성격에 맞게 여러개의 게시글을 보관할 수 있도록 설계

...
    String[] titles = new String[200];
    String[] contents = new String[200];
    String[] passwords = new String[200];
    int size = 0;
    
...

        case "add":
          System.out.println("[게시글 등록]");
          System.out.print("제목: ");
          titles[size] = keyScan.nextLine();

          System.out.print("내용: ");
          contents[size] = keyScan.nextLine();

          System.out.print("비밀번호: ");
          passwords[size] = keyScan.nextLine();

          System.out.printf("제목: %s\n", titles[size]);
          System.out.printf("내용: %s\n", contents[size]);
          System.out.printf("암호: %s\n", passwords[size]);

          size++;

          break;
...

출력 결과는 아까와 같지만 배열에 순서대로 게시글이 저장

Console
[게시판 관리]
명령> add
[게시글 등록]
제목: title
내용: content
비밀번호: passwd
제목: title
내용: content
암호: passwd
명령>


08. 상수(final 변수)를 이용하여 배열의 크기를 다루기

final int를 이용해 배열의 크기를 지정하는 상수 BOARD_LENGTH 생성
해당 상수를 배열의 크기를 지정하는 코드에 대체
게시글 등록 파트에도 게시물 최대 개수를 BOARD_LENGTH로 하여 그 이상 추가할 수 없도록 함

...
    final int BOARD_LENGTH = 200;
    String[] titles = new String[BOARD_LENGTH];
    String[] contents = new String[BOARD_LENGTH];
    String[] passwords = new String[BOARD_LENGTH];
    int size = 0;
...
        case "add":
          System.out.println("[게시글 등록]");
          if (size == BOARD_LENGTH) {
            System.out.println("더이상 게시글을 추가할 수 없습니다.");
            break;
          }
...

09. 게시글 목록 출력하기

게시글 목록 출력파트인 list에 명령어 추가
현재 배열의 크기인 size만큼 배열을 출력
title 배열에는 게시글의 제목이 저장되이있어 게시글의 제목이 저장순서와 함께 출력

        case "list":
          System.out.println("[게시글 목록]");

          for (int i = 0; i < size; i++) {
            System.out.printf("%d, %s\n", i, titles[i]);
          }
          break;

Console
[게시판 관리]
명령> add
[게시글 등록]
제목: title
내용: content
비밀번호: passwd
...
명령> add
제목: title2
내용: content2
비밀번호: passwd2
...
명령> list
[게시글 목록]
0, title
1, title2
명령>


10. 게시글 상세 조회

게시글 상세 조회파트인 view에 명령어 추가
게시글에 저장된 size번호와 입력받은 index를 비교해 해당 게시글의 정보 출력

...
        case "view":
          System.out.println("[게시글 조회]");
          System.out.print("번호? ");
          int index = Integer.parseInt(keyScan.nextLine());

          if (index < 0 || index >= size) {
            System.out.println("무효한 게시글 번호입니다.");
            break;
          }

          System.out.printf("제목: %s\n", titles[index]);
          System.out.printf("내용: %s\n", contents[index]);
          System.out.printf("암호: %s\n", passwords[index]);

          break;
...

Console
...
명령> view
[게시글 조회]
번호? 4
무효한 게시글 번호입니다.
...
번호? 0
제목: title
내용: content
암호: passwd


11,12. 게시글 조회수, 등록일 추가하기

조회수, 등록일 저장하는 배열 추가
view로 상세조회 시 암호 대신 조회수와 등록일이 출력되도록 함

...
int[] viewCounts = new int[BOARD_LENGTH];
Date[] createdDates = new Date[BOARD_LENGTH];
...
        case "view":
          ...
          viewCounts[index]++;
          System.out.printf("제목: %s\n", titles[index]);
          System.out.printf("내용: %s\n", contents[index]);
          System.out.printf("조회수: %d\n", viewCounts[index]);
          System.out.printf("등록일: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS\n", createdDates[index]);
          break;
...

Console
...
번호? 0
제목: title
내용: content
조회수: 1
등록일: 2021-07-04 20:22:41


13. 게시글 변경하기

게시글 변경파트인 update에 명령어 추가
게시글 번호를 받아 해당 게시글의 바꿀 제목과 내용을 입력받음
입력 후 변경여부를 다시 물어 "y"를 입력하지 않은 나머지는 전부 N으로 받음
y 입력 시 변경된 게시글 정보 저장되도록 함
view나 list로 출력 시 변경된 내용 확인 가능

...
        case "update":
          System.out.println("[게시글 변경]");
          System.out.print("번호? ");
          index = Integer.parseInt(keyScan.nextLine());

          if (index < 0 || index >= size) {
            System.out.println("무효한 게시글 번호입니다.");
            break;
          }

          System.out.printf("제목(%s)? ", titles[index]);
          String title = keyScan.nextLine();
          System.out.printf("내용(%s)? ", contents[index]);
          String content = keyScan.nextLine();

          System.out.print("정말 변경하시겠습니까?(y/N) ");
          if (!keyScan.nextLine().equals("y")) {
            System.out.println("게시글 변경을 취소하였습니다.");
            break;
          } 
          titles[index] = title;
          contents[index] = content;
          System.out.println("게시글을 변경하였습니다.");
          break;
...

Console
...
명령> update
번호? 0
제목? title100
내용? content100
정말 변경하시겠습니까?(y/N) n
게시글 변경을 취소하였습니다.
...
정말 변경하시겠습니까?(y/N) y
게시글을 변경하였습니다.
명령> view
번호? 0
제목: title100
내용: content100
조회수: 2
등록일: 2021-07-04 20:22:41


14. 게시글 삭제하기

게시글 삭제파트인 delete에 명령어 추가
게시글 내용 변경과 거의 비슷하나 해당 배열 삭제 후 다음 배열들을 전부 한 칸 씩 앞으로 옮기는 작업 추가

...
        case "delete":
          System.out.println("[게시글 삭제]");
          System.out.print("번호? ");
          index = Integer.parseInt(keyScan.nextLine());

          if (index < 0 || index >= size) {
            System.out.println("무효한 게시글 번호입니다.");
            break;
          }

          System.out.print("정말 삭제하시겠습니까?(y/N) ");
          if (!keyScan.nextLine().equals("y")) {
            System.out.println("게시글 삭제를 취소하였습니다.");
            break;
          } 

          for (int i = index; i < size - 1; i++) {
            titles[i] = titles[i + 1];
            contents[i] = contents[i + 1];
            viewCounts[i] = viewCounts[i + 1];
            createdDates[i] = createdDates[i + 1];
          }
          size--;
          System.out.println("게시글을 삭제하였습니다.");
          break;
...

Console
...
명령> delete
번호? 0
정말 삭제하시겠습니까?(y/N) y
게시글을 삭제하였습니다.
명령> list
[게시글 목록]
0, title2

0개의 댓글