기본 프로그램 App.java 생성
public class App {
public static void main(String[] args) {
System.out.println("[게시판 관리]");
}
}
Console
[게시판 관리]
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
반복문을 사용해 명령어를 계속 입력받을 수 있도록 함
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
명령>
...
"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
안녕히 가세요!
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
안녕히 가세요!
게시글 입력을 위해 입력파트인 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
명령>
위와 같은 코드는 하나의 게시글만 출력하고 종료
게시판의 성격에 맞게 여러개의 게시글을 보관할 수 있도록 설계
...
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
명령>
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;
}
...
게시글 목록 출력파트인 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
명령>
게시글 상세 조회파트인 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
조회수, 등록일 저장하는 배열 추가
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
게시글 변경파트인 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
게시글 삭제파트인 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