- 아직은 DB를 사용하지 않기 때문에 Collection타입으로 클레스 객체를 받아 저장하는 방명록을 만들자!
- 1) 회의 전 개인 구상
👉 방명록의 속성 content, name, date .. 등을 정의한 Memo.class를 만들자
👉 List< >타입으로 데이터를 저장하고 그 데이터를 활용하여 불러오기, 삭제 , 수정 작업이 이뤄지는 MemoList.class를 만들자.
👉 Main 에서는 Scanner를 활용하여 입력받은 숫자에 따른 기능 구별과 함수 호출을 담당하자.
👉 MemList.class의 객체를 하나로 사용해야 데이터가 축적되므로 SingleTon 패턴으로 구현하자.
👉 번호로 동작을 구분할 때 if~ else if~ else 구문보다는 switch ~ case를 활용해보자.
- 2) 프로젝트 진행 방향 회의
👉 각자 파트를 나눠서 진행하는 것도 좋지만, 미니프로젝트 취지 자체가 java에 대한 이해를 고취시키기 위함.
👉 시간을 정해 각자 구현해보고, 코드 리뷰를 하면서 효율적이고 좋은 코드가 있다면 추가하고 불필요한 코드가 있다면 삭제하여 조각조각 구현하자.
- 3) 코드의 수정과 구상의 실현
👉 처음에 데이터의 저장과 각종 기능을 담당하는 MemoList.class의 공유를 위해 static변수로 선언해서 사용했다.
👉 static으로 선언한 자료는 프로그램 시작과 종료까지 유지되는 형태이므로 프로젝트가 커진다면 감당할 수 없을 것 같다는 생각과 피드백을 받았다.
👉 final로 MemoList.class를 선언 해놓고, 같은 객체를 반환해줄 수 있는 getInstace()를 통해 같은 객체를 사용할 수 있게 구현했다.
- Memo.class
package com.pricehoon.solutution.project.memo;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class Memo {
//id값을 따로 변수 선언하지 않고 배열의 index를 활용한 부분이 걸린다.
private String name;
private String pwd;
private String content;
private LocalDateTime date;
public Memo(String name,LocalDateTime date ,String pwd,String content) {
this.name = name;
this.pwd = pwd;
this.date = date;
this.content = content;
}
public void setContent(String content) {
this.content = content;
}
public void setDate(LocalDateTime date) {
this.date = date;
}
public String getContent(){
return content;
}
public String getName() {
return name;
}
public String getPwd() {
return pwd;
}
public LocalDateTime getDate() {
return date;
}
}
- MemoList.class
package com.pricehoon.solutution.project.memo;
import java.time.LocalDateTime;
import java.util.*;
public class MemoList {
private static final MemoList memoList_1 = new MemoList();
private List<Memo> memoList = new ArrayList<>();
//하나의 객체를 지속적으로 사용하기 위한 메서드
public static MemoList getInstance() {
if (memoList_1 == null) {
return new MemoList();
}
return memoList_1;
}
//데이터를 추가하기 위한 함수
public void addPost(Memo memo) {
memoList.add(memo);
System.out.println("메모가 정상적으로 저장되었습니다.");
}
//저장된 데이터를 모두 보여주는데, 데이터의 수정과 삽입에 따라 현재 시간이 달라지므로 그 때 오름차순 정렬을 해준다.
public void showAll() {
//원래는 Date도 String으로 작업했었는데 크기 비교에 다른 정렬이 어려워서 LocalDateTime 타입으로 수정.
Collections.sort(memoList, new Comparator<Memo>() {
@Override
public int compare(Memo o1, Memo o2) {
if(o1.getDate().isBefore(o2.getDate())){
return 0;
}else{
return -1;
}
}
});
for (int i = 0; i < memoList.size(); i++) {
System.out.print(i + 1 + " ");
System.out.print(memoList.get(i).getName() + " ");
System.out.print(memoList.get(i).getContent() + " ");
System.out.println(memoList.get(i).getDate());
}
}
//삭제와 수정시 해당 게시글의 번호를 확인하는 작업이 중복되어 일어나므로 따로 함수로 분리
public Boolean confirmNum(int num) {
if (num > memoList.size() - 1) {
System.out.println("잘못된 게시글 번호입니다!");
return false;
}
return true;
}
//삭제와 수정시 해당 게시글의 비밀번호를 확인하는 작업이 중복되어 일어나므로 따로 함수로 분리
public Boolean confirmPwd(int num, String pwd) {
for (int i = 0; i < memoList.size(); i++) {
if (memoList.get(num) != null) {
String confirmPwd = memoList.get(num).getPwd();
if (confirmPwd.equals(pwd)) {
return true;
} else {
System.out.println("비밀번호가 틀립니다!");
return false;
}
} else {
System.out.println("오류");
}
}
return false;
}
//게시글 번호와, 비밀번호 확인을 거치기 된다면 delete()호출로 방명록 삭제
public void deletePost(int num) {
System.out.println("삭제가 완료되었습니다!");
memoList.remove(num);
}
//게시글 번호와, 비밀번호 확인을 거치기 된다면 update()호출로 방명록 수정
public void update(int num, String content) {
System.out.println("수정이 완료되었습니다!");
LocalDateTime dateTime = LocalDateTime.now();
memoList.get(num).setContent(content);
memoList.get(num).setDate(dateTime);
}
}
- Application.class(main act)
package com.pricehoon.solutution.Java;
import com.pricehoon.solutution.project.memo.Memo;
import com.pricehoon.solutution.project.memo.MemoList;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
//Switch는 그대로 가는걸로
//수정 삭제 추가하기
//예외처리
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("1:추가, 2:전체보기, 3:삭제, 4.수정, 5.종료");
int select = sc.nextInt();
if (select == 5) {
System.out.println("종료");
break;
}
//번호에 따른 기능 구분
switch (select) {
case 1:
insertPost();
break;
case 2:
showAll();
break;
case 3:
delete();
break;
case 4:
update();
break;
default:
System.out.println("알맞은 번호를 선택하세요!");
break;
}
}
}
//데이터 추가
public static void insertPost() {
MemoList memoList = MemoList.getInstance();
LocalDateTime dateTime = LocalDateTime.now();
Scanner sc = new Scanner(System.in);
System.out.println("메모추가하기");
System.out.print("이름 :");
String name = sc.next();
System.out.print("비밀번호 : ");
String pwd = sc.next();
sc.nextLine();
System.out.print("메모내용 : ");
String content = sc.nextLine();
Memo memo = new Memo(name,dateTime ,pwd, content);
memoList.addPost(memo);
}
//데이터 다 보여주기
public static void showAll() {
MemoList memoList = MemoList.getInstance();
memoList.showAll();
}
//데이터 지우기
public static void delete(){
MemoList memoList = MemoList.getInstance();
Scanner sc = new Scanner(System.in);
System.out.println("--게시글 삭제하기--");
System.out.println("삭제하고자 하는 게시글의 번호를 입력하세요!");
int num = sc.nextInt();
if(!memoList.confirmNum(num-1)){
return;
}
System.out.println("비밀번호를 입력하세요!");
String pwd = sc.next();
if(!memoList.confirmPwd(num-1,pwd)){
return;
}
memoList.deletePost(num-1);
}
//데이터 갱신
public static void update(){
MemoList memoList = MemoList.getInstance();
Scanner sc = new Scanner(System.in);
System.out.println("--게시글 수정하기--");
System.out.println("수정하고자 하는 게시글의 번호를 입력하세요!");
int num = sc.nextInt();
// 현재 입력한 번호 -1 를 해줘서 Array index에 접근하자
if(!memoList.confirmNum(num-1)){
return;
}
System.out.println("비밀번호를 입력하세요!");
String pwd = sc.next();
if(!memoList.confirmPwd(num-1,pwd)){
return;
}
sc.nextLine();
System.out.println("수정하고자 하는 내용을 입력하세요! : ");
String content = sc.next();
memoList.update(num-1,content);
}
}
1) 굳이 idx를 설정해야하나? 라는 의문으로 index로만 작업한 것.
2) 정말 필요한 부분을 제외한다면 코드는 더욱 간결해질 듯.
3) 너무 구현에만 신경썼나라는 생각이 드는 코드.
4) 게시글 번호를 확인하는 로직을 생각해서 작성했는데 더 좋은 방법이 있을 듯..