< 구현 기능 >
1. 회원가입
- ID 중복 확인 가능
- 로그인 중에 회원가입 불가
- 첫번째로 회원가입 하는 사람은 관리자로 지정된다. (회원 번호 0번)
2. 로그인
- 가입되지 않은 ID 확인 가능
- PW 불일치 여부 확인 가능
- 로그인 상태에서 로그인 불가
3. 로그아웃
- 로그아웃 상태에서 로그아웃 불가
- 로그아웃 여부 질문에 맞는 답이 입력되지 않을 경우,
재질문을 통해 로그아웃 할 수 있게 함.
4. 게시물 작성(추가)
- 로그인 회원만 작성(추가) 가능
5. 게시물 리스트
- 작성자 확인 가능
6. 게시물 상세보기
- 작성자 확인 가능
- 조회수, 추천수 확인 가능
7. 게시물 조회수
8. 게시물 추천
-중복추천 금지는 아직 불가
9. 게시물 삭제
- 관리자, 작성자 본인만 삭제 가능
10. 게시물 수정
- 관리자, 작성자 본인만 수정 가능
11. 명령어 리스트 보기
12. 게시판 종료
<어려운 점>
- 코드가 길어질 수록 복잡성에 적응하지 못하고 작은 실수가 많아진다.
- 아직 제어문을 제대로 제어하지 못한다.
for문과 if문이 중첩될 때 return, else를 적절하게 사용하는 법을 명확히 알고 있는 게 아니라
오류가 나면 예상되는 문제점을 수정해서 여러번 실행시켜보는 방식으로 오류를 해결한다.
그런데 때로는 좀 전에 작성 했던 코드가 왜 안됐는지 정확히 모르는 경우가 있다.
- 원하는 실행결과에 대한 논리구조를 짜는 데 어려움이 있다.
- 다른 클래스의 변수값을 활용하는 데 익숙하지 않다.
- IF문의 조건 속에 어떤 변수타입이 적절할 지 파악하는 데 오래 걸린다.
- 중복되는 코드들을 하나로 만들어 정리해서 쓰는 것이 아직 어렵다.
<정원pp소감>
막히는 부분이 많아서 상대적으로 도움을 많이 받았다.
혼자했으면 오늘까지 완료하지 못 했을 문제들을 해결할 수 있게 됐다.
<혜련pp소감>
서로의 생각을 공유할 수 있어서 좋았다.
실행결과는 똑같지만 소스코드가 다르다는 것이 신기했고
상대방이 더 효율적일 코드를 쓸 경우 그걸 참고할 수 있어서 좋았다.
import java.util.Scanner;
import java.util.Calendar;
import java.text.SimpleDateFormat;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Board board = new Board();
board.setScanner(scanner);
board.start();
scanner.close();
}
}
class Board {
Article[] articles;
int articleLastIndex;
int lastArticle;
int lastMember;
Member[] members;
int memberLastIndex;
Member loginedMember;
Board() {
articles = new Article[100];
articleLastIndex = -1;
lastArticle = 0;
lastMember = -1;
members = new Member[100];
memberLastIndex = -1;
}
Scanner scanner;
void setScanner(Scanner scanner) {
this.scanner = scanner;
}
void showHelp() {
System.out.println("== 명령어 리스트 ==");
System.out.println("help : 명령어 리스트");
System.out.println("list : 게시물 리스팅");
System.out.println("add : 게시물 추가");
System.out.println("exit : 종료");
System.out.println("detail ${게시물 번호} : 게시물 상세보기");
System.out.println("delete ${게시물 번호} : 게시물 삭제");
System.out.println("modify ${게시물 번호} : 게시물 수정");
System.out.println("like ${게시물 번호} : 게시물 추천");
System.out.println("sign_up : 회원가입");
System.out.println("log_in : 로그인");
System.out.println("log_out : 로그아웃");
}
void start() {
showHelp();
while( true ) {
System.out.println("--------------------------------------------------------------------");
System.out.printf("게시판) ");
String command = scanner.next().trim();
System.out.println("--------------------------------------------------------------------");
if ( command.equals("help")) {
scanner.nextLine();
showHelp();
}
else if ( command.equals("add")) {
scanner.nextLine();
doCommandAdd();
}
else if ( command.equals("detail")) {
int idToDetail = scanner.nextInt();
scanner.nextLine();
doCommandDetail(idToDetail);
}
else if ( command.equals("delete")) {
int idToDelete = scanner.nextInt();
scanner.nextLine();
doCommandDelete(idToDelete);
}
else if ( command.equals("modify")) {
int idToModify = scanner.nextInt();
scanner.nextLine();
doCommandModify(idToModify);
}
else if ( command.equals("list")) {
scanner.nextLine();
doCommandList();
}
else if ( command.equals("like")) {
int idToLike = scanner.nextInt();
scanner.nextLine();
doCommandLike(idToLike);
}
else if ( command.equals("exit")) {
scanner.nextLine();
doCommandExit();
break;
}
else if ( command.equals("sign_up")) {
scanner.nextLine();
doCommandSignUp();
}
else if ( command.equals("log_in")) {
scanner.nextLine();
doCommandLogIn();
}
else if ( command.equals("log_out")) {
scanner.nextLine();
doCommandLogOut();
}
else {
scanner.nextLine();
System.out.println("< 일치하는 항목이 존재하지 않습니다. >");
}
}
}
void doCommandLogOut() {
if ( loginedMember == null ) {
System.out.println("< 현재 접속 중이지 않은 상태로 로그아웃 할 수 없습니다.>");
return;
}
System.out.println("\t\t\t== 로그아웃 ==");
System.out.printf("< %s님. 로그아웃 하시겠습니까?(yes or no) >", loginedMember.userId);
String yesOrNo = scanner.nextLine().trim();
if ( yesOrNo.equals("yes")) {
loginedMember = null;
System.out.println("< 로그아웃 상태로 전환되었습니다. >");
}
else if ( yesOrNo.equals("no")) {
System.out.println("< 로그인 상태를 유지합니다. >");
}
else {
System.out.println("< 다시 입력바랍니다. >");
doCommandLogOut();
}
}
int getMembersCount() {
return memberLastIndex + 1;
}
void doCommandLogIn() {
if ( getMembersCount() == 0 ) {
System.out.println("< 관리자님. 회원가입 후 게시판 관리를 부탁드립니다. >");
return; // 처음 가입해야 하는 사람은 관리자로 지정.
}
if ( loginedMember != null ) {
System.out.println("< 현재 접속 중으로 로그인을 하실 수 없습니다. >");
return;
}
System.out.println("\t\t\t== 로그인 ==");
System.out.printf("ID를 입력바랍니다 :");
String loginId = scanner.nextLine();
System.out.printf("PW를 입력바랍니다 :");
String loginPw = scanner.nextLine();
for ( int i = 0; i <= memberLastIndex; i++ ) {
if ( members[i].userId.equals(loginId)) {
if ( members[i].userPw.equals(loginPw)) {
loginedMember = members[i];
System.out.printf("< %s님. 로그인에 성공하셨습니다. >\n", loginedMember.userId);
}
}
if ( members[i].userId.equals(loginId)) {
if ( !members[i].userPw.equals(loginPw)) {
System.out.println("< 등록된 ID로 PW가 일치하지 않습니다. >");
System.out.println("< 다시 입력바랍니다. >");
}
return;
}
}
System.out.println("< 등록되지 않은 ID입니다. >");
System.out.println("< 회원가입 후 로그인 바랍니다. >");
}
void doCommandSignUp() {
if ( loginedMember != null ) {
System.out.println("< 현재 접속 중으로 회원가입을 하실 수 없습니다. >");
return;
}
System.out.println("\t\t\t== 회원가입 ==");
Member newMember = new Member();
newMember.id = lastMember + 1; // 게시글 작성할 때
System.out.printf("ID를 입력바랍니다 : ");
newMember.userId = scanner.nextLine();
for ( int i = 0; i <= memberLastIndex; i++ ) {
if ( members[i].userId.equals(newMember.userId)) {
System.out.println("< 중복되는 ID입니다. 다시 입력바랍니다. >");
doCommandSignUp();
return;
}
}
System.out.printf("PW를 입력바랍니다 : ");
newMember.userPw = scanner.nextLine();
if ( newMember.id == 0 ) {
System.out.println("< 관리자님. 해당 게시판 관리를 잘 부탁드립니다. >");
}// 관리자 권한 부여
else if ( newMember.id >= 1 ) {
System.out.printf("< %s님. %d번째 회원이 되신 것을 축하드립니다. >\n", newMember.userId,
newMember.id);
}
int newMemberLastIndex = memberLastIndex + 1;
members[newMemberLastIndex] = newMember;
memberLastIndex++;
lastMember++;
}
void doCommandLike(int id) {
Article article = getArticleById(id);
System.out.println("\t\t\t== 게시물 추천 ==");
if ( article == null ) {
System.out.println("< 해당 게시물은 존재하지 않습니다. >");
return;
}
System.out.printf("< %d번 게시물을 추천하시겠습니까?(yes or no) >", article.id);
String yesOrNo = scanner.nextLine();
if ( yesOrNo.equals("yes")) {
System.out.printf("< %d번 게시물을 추천하셨습니다. >\n", article.id);
article.like = article.like + 1;
}
else if ( yesOrNo.equals("no")) {
System.out.println("< 이전으로 돌아갑니다. >");
}
else {
System.out.println("< 다시 입력바랍니다. >");
doCommandLike(id);
}
}
void doCommandDelete(int id) {
int index = -1;
for ( int i = 0; i <= articleLastIndex; i++ ) {
if ( articles[i].id == id ) {
index = i;
break;
}
}
if ( index == -1 || articles[index] == null ) {
System.out.println("< 삭제 가능한 게시물이 존재하지 않습니다. >");
return;
}
if ( articles[index].memberId == loginedMember.id || loginedMember.id == 0) { //합쳐버림
System.out.println("\t\t\t== 게시물 삭제 == ");
}
else {
System.out.println("< 게시물 수정은 작성자 본인만 가능합니다. >");
return;
}
System.out.printf("< %d번 게시물을 삭제하시겠습니까?(yes or no) >", articles[index].id);
String yesOrNo = scanner.nextLine().trim();
if ( yesOrNo.equals("yes")) {
for ( int i = index; i <= articleLastIndex-1; i++ ) {
articles[i] = articles[i + 1];
}
articleLastIndex--;
System.out.println("< 해당 게시물 삭제를 완료하였습니다. >");
}
else if ( yesOrNo.equals("no")) {
System.out.println("< 이전으로 돌아갑니다. >");
}
else {
System.out.println("< 다시 입력바랍니다. >");
doCommandDelete(id);
}
}
void doCommandModify(int id) {
Article article = getArticleById(id);
if ( article == null ) {
System.out.println("< 수정 가능한 게시물이 존재하지 않습니다. >");
return;
}
if ( article.memberId == loginedMember.id || loginedMember.id == 0 ) { // 합쳐버림
System.out.println("\t\t\t== 게시물 수정 == ");
}
else {
System.out.println("< 게시물 수정은 작성자 본인만 가능합니다. >");
return;
}
System.out.printf("< %d번 게시물을 수정하시겠습니까?(yes or no) > ", article.id);
String yesOrNo = scanner.nextLine().trim();
if ( yesOrNo.equals("yes")) {
System.out.printf("제목 : ");
article.title = scanner.nextLine().trim();
System.out.printf("내용 : ");
article.body = scanner.nextLine().trim();
System.out.printf("< %d번 게시물 수정을 완료하였습니다. >\n", article.id );
}
else if ( yesOrNo.equals("no")) {
System.out.println("< 이전으로 돌아갑니다. >");
}
else {
System.out.println("다시 입력바랍니다.");
doCommandModify(id);
}
}
Article getArticleById(int id) {
for ( int i = 0; i <= articleLastIndex; i++ ) {
if ( articles[i].id == id ) {
return articles[i];
}
}
return null;
}
int getArticleView(int id) {
for ( int i = 0; i <= articleLastIndex; i++ ) {
if ( articles[i].id == id ) {
return articles[i].view = articles[i].view + 1;
}
}
return 0;
}
void doCommandDetail(int id) {
System.out.println("\t\t\t== 게시물 상세 ==");
Article article = getArticleById(id);
if ( article == null ) {
System.out.println("< 해당 게시물은 존재하지 않습니다. >");
return;
}
getArticleView(id);
/*article.view = article.view + 1; --> 위 메소드를 이렇게 한줄로 작성해도 결과는 똑같은데
공부할겸해서 메소드로 만들어보았어용. */
System.out.printf("번호 : %d\n", article.id);
System.out.printf("날짜 : %s\n", article.nowDate);
System.out.printf("작성자 : %s\n", article.addUserId); // 해당 게시물 번호로 조회한 배열의 저장된 작성자를 불러오게 되어요.
System.out.printf("제목 : %s\n", article.title);
System.out.printf("내용 : %s\n", article.body);
System.out.printf("추천수 : %d\n", article.like);
System.out.printf("조회수 : %d\n", article.view);
}
void doCommandList() {
System.out.println("\t\t\t== 게시물 리스트 ==");
if ( lastArticle == 0 ) {
System.out.println("< 게시물이 존재하지 않습니다. >");
return;
}
System.out.println(" 번호 | 날짜 | 제목 | 작성자 | 추천수 | 조회수");
for ( int i = 0; i <= articleLastIndex; i++ ) {
System.out.printf(" %d | %-10s | %-21s | %-2s | %d | %d \n", articles[i].id, articles[i].nowDate,
articles[i].title, articles[i].addUserId, articles[i].like, articles[i].view);
}
}
void doCommandAdd() {
if ( loginedMember == null ) {
System.out.println("< 게시물 작성은 로그인 회원만 가능합니다. >");
return;
}
System.out.println("\t\t\t== 게시물 추가 ==");
Article newArticle = new Article();
newArticle.id = lastArticle + 1;
newArticle.nowDate = getNowDate();
System.out.printf("제목 : ");
newArticle.title = scanner.nextLine().trim();
System.out.printf("내용 : ");
newArticle.body = scanner.nextLine().trim();
newArticle.like = 0;
newArticle.view = 0;
newArticle.addUserId = loginedMember.userId;
// 게시물 list, detail 에 작성자(userId)를 나타내기 위해서 이번에는 Article 클래스에 addUserId 변수를
//만들어서 현재 로그인 중인 (loginedMember.userId)를 저장해서 해당 게시물 배열 값에 함께 넘겨주었어용.
newArticle.memberId = loginedMember.id; // 이렇게 로그인해있는 아이디의 id(번호: 고유번호)를
// 게시물 클래스 변수인 memberId에 넘겨주어서 이 번호가 일치하는 작성자의 게시물에 대해서 수정, 삭제할거에요
System.out.printf("< %d번 게시물이 생성되었습니다. >\n", newArticle.id);
lastArticle++;
int newArticleLastIndex = articleLastIndex + 1;
articles[newArticleLastIndex] = newArticle;
articleLastIndex++;
}
String getNowDate() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat Date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = Date.format(cal.getTime());
return dateStr;
}
void doCommandExit() {
System.out.println("\t\t\t== 게시판 종료 ==");
}
}
class Article {
int id;
String nowDate;
String title;
String body;
String addUserId;
int like;
int view;
int memberId; // 회원가입할 때, 각 회원한테 부여하는 고유 번호로써 Member클래스의 int id 번호를 넘겨주어서
// 일치시켜 줄거에용 (add) 메서드 참고!
}
class Member {
int id; // 회원 가입 시, 회원별로 부여하는 번호(순차적으로)로써 게시물 작성할 때 이 번호를 작성 게시물 내용에 포함 시킬
// 거에용
String nowDate;
String userId;
String userPw;
}
'IT관련 > JAVA_자유 노트' 카테고리의 다른 글
[수업창작] 2020-05-18 회원정보 파일저장 (0) | 2020.05.19 |
---|---|
[수업창작]게시판만들기 20-05-17 (0) | 2020.05.17 |
[수업창작]게시판만들기 20-05-14 (0) | 2020.05.14 |
[수업창작] 게시판만들기 20-05-11 (0) | 2020.05.11 |
[수업창작] 게시판만들기 20-05-10 (0) | 2020.05.10 |
댓글