이제 어떠한 기준으로 메소드를 분리 해야 할까요? 힌트는 나와있습니다.
그 답은 바로 기능단위로 분리하는 것입니다. 이렇게 한다면 여러 사람이 작업
할 수 있지 않을까요? 한 명당 한가지의 메소드를 맡아서 진행하는 것입니다.
그럼 실제로 해보도록 하죠^^;
private static void registDocumentForm() {
// 4. 등록 폼출력
System.out.println("제목: ");
System.out.println("내용: ");
}
등록 폼 출력입니다. 별 문제 없이 되네요.
중간에 static은 main 메소드가 static이기 때문에 붙은 것입니다.
모든 영역에서 static영역에 것들을 쓸 수 있지만.
static영역은 모든 영역에 있는 것을 쓸 수 없습니다.
그렇게 때문에 static이란 키워드를 붙였습니다. Static은 같은 영역이니까 참조 가능하겠죠?
자 이제 문제가 발생합니다.
private static void registDocument() {
// 4.1 제목 추출
String userInputTitle = outputData[1];
// 4.2 내용 추출
String userInputContent = outputData[2];
// 5. 유효성 검사
if (userInputTitle.length() < 1
&& userInputTitle.length() > 600) {
return;
}
if (userInputContent.length() < 1
&& userInputContent.length() > 2000) {
return;
}
// 6. 문서 번호 가져오기
systemSeq += 1;
// 7. 등록일 가져오기
Date systemDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.KOREA);
String sysDate=dateFormat.format(systemDate);
// 8. 조회수 입력
int configHit = 0;
Map<String, String> documentSave = new HashMap<String, String>();
// 9. 등록
documentSave.put("SEQ", String.valueOf(systemSeq));
documentSave.put("TITLE", userInputTitle);
documentSave.put("CONTENT", userInputContent);
documentSave.put("REGIST_DATE", sysDate);
documentSave.put("HIT", String.valueOf(configHit));
documentList.add(documentSave);
// 10. 결과 출력
System.out.println("등록 완료");
}
밑줄 쳐진 outputData[1]; outputData[2]; systemSeq documentList 여기에서 컴파일
오류가 납니다.
왜 그럴까요? 위에서 말했던 영역에서 문제가 나타났습니다.
그럼 이제 어떻게 해결해야 할까요? 변수를 공유하면 이 문제들이 해결되지 않을까요? 해보도록 하죠^^;
private static void registDocument(String[] outputData, int systemSeq, List<Map<String, String>> documentList) {
}
이렇게 하니까 해결이 됩니다. 이것이 바로 변수를 공유하는 법 중 하나인 파라미터로 넘기기 입니다.
자아 이제 나머지 것도 해볼까요?
if (userAction.equals("RF")) {
registDoumentForm();
} else if (userAction.equals("RD")) {
registDocument(outputData,systemSeq, documentList);
} else if (userAction.equals("VD")) {
viewDocument(outputData,documentList);
} else if (userAction.equals("VL")) {
viewDocumentList(documentList);
} else if (userAction.equals("DD")) {
deleteDocument(outputData,documentList);
} else if (userAction.equals("EF")) {
editDocumentForm(outputData,documentList);
} else if (userAction.equals("ED")) {
editDocument(outputData,documentList);
} else {
System.out.println("잘못 입력하셨습니다");
}
}
메소드 안에 내용이 바뀌는 것이 아니기 때문에 이 정도만 보여줘도 되겠네요.
여기서 생각해야 할 문제가 있네요. 무엇인가 하면 우리가 너무 많은 것을 파라미터로 넘기는 것이 아닌가요?
저는 문뜩 그런 생각이 드네요. 예를 들어서systemSeq값은 시스템에서 참조하는 값인데도 불구하고 그냥 공유를 시켜버리네요.
저는 불필요 할거 같아서 다른 방법으로 변수를 공유하는 법을 찾았습니다.
그래서 나온 것이 바로 field로 옴 기기 즉 property로 옴 기는 것입니다. 한번 해볼까요?
public class Board {
private static int systemSeq = 0;
}
이렇게 하고 나서
else if (userAction.equals("RD")) {
registDocument(outputData, documentList);
}
아무 이상 없이 잘되네요. 잘 이해되지 않을 거 같아서 추가로 설명합니다. 왜 저 변수를 property로 옴 겼을까요?
우리가 생각하는 저 메소드에 의도는 그저 제목과 내용만 넘겨주면 시스템이 나머지 것을 해야 하는데
그렇지가 안네요. 아직도 남아 있는 documentList 이것도 우리의 의도와 다르게 들어가 있네요,
이것도 property로 빼보도록 하죠.
if (userAction.equals("RF")) {
registDoumentForm();
} else if (userAction.equals("RD")) {
registDocument(outputData);
} else if (userAction.equals("VD")) {
viewDocument(outputData);
} else if (userAction.equals("VL")) {
viewDocumentList();
} else if (userAction.equals("DD")) {
deleteDocument(outputData);
} else if (userAction.equals("EF")) {
editDocumentForm(outputData);
} else if (userAction.equals("ED")) {
editDocument(outputData);
} else {
System.out.println("잘못 입력하셨습니다");
}
}
아 정말 간단하게 되었네요. 이것으로 완료 할까 합니다. 이제 다음 단계인 클래스로 추출을 해볼까요?
그건 다음 단계에 하도록 하죠.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class Board {
private static int systemSeq = 0;
private static List