공적's life

3-1 메소드로 분리 본문

Programing/Java programing

3-1 메소드로 분리

melpis 2010. 7. 24. 11:46

이제 어떠한 기준으로 메소드를 분리 해야 할까요? 힌트는 나와있습니다.

 

그 답은 바로 기능단위로 분리하는 것입니다. 이렇게 한다면 여러 사람이 작업

 

할 수 있지 않을까요? 한 명당 한가지의 메소드를 맡아서 진행하는 것입니다.

 

그럼 실제로 해보도록 하죠^^;

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> documentList = new ArrayList>();;

	public static void main(String[] args) throws IOException, ParseException {

		// 문서 등록 폼 Register Document Form
		// 문서 등록 Register Document
		// 문서 상세 보기 view Document
		// 문서 목록 보기 view Document List
		// 문서 삭제 Delete Document
		// 문서 수정 폼 Edit Document Form
		// 문서 수정 Edit Document

		// 1. 사용법 출력
		System.out.println("문서 등록 폼: ex) RF");
		System.out.println("문서 등록: ex) RD:제목:내용 ");
		System.out.println("문서 상세 보기: ex) VD:문서번호 ");
		System.out.println("문서 목록 보기: ex) VL ");
		System.out.println("문서 삭제: ex) DD:문서번호 ");
		System.out.println("문서 수정폼: ex) EF:문서번호 ");
		System.out.println("문서 수정: ex) ED:제목:내용 ");

		while (true) {
			// 2. 사용자 입력
			InputStreamReader inputStreamReader = new InputStreamReader(
					System.in);
			BufferedReader br = new BufferedReader(inputStreamReader);
			String userInputData = br.readLine();

			// 3. 데이터 추출
			// 3.1 데이터 구분하기
			String outputData[] = userInputData.split("\\:");

			// 3.2 사용자의 의도 알아 내기
			String userAction = outputData[0].toUpperCase();

			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("잘못 입력하셨습니다");
			}

		}

	}
	
	private static void registDoumentForm() {

		// 4. 등록 폼출력
		System.out.println("제목: ");
		System.out.println("내용: ");

	}

	private static void registDocument(String[] outputData) {
		// 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 documentSave = new HashMap();
		// 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("등록 완료");

	}
	
	private static void viewDocument(String[] outputData) throws ParseException {
		// 사용자가 입력한 문서 번호 가져오기
		String userInputSeq = outputData[1];

		// 일치할경우 저장할 Map타입
		Map documentSave = null;

		// 검사
		for (int indexI = 0; indexI < documentList.size(); indexI++) {
			Map checkDocument = documentList.get(indexI);
			if (userInputSeq.equals(checkDocument.get("SEQ"))) {
				documentSave = checkDocument;
				break;
			}
		}
		if (documentSave != null) {
			int updateHit = Integer.parseInt(documentSave.get("HIT")) + 1;
			documentSave.put("HIT", String.valueOf(updateHit));

			String tempSeq = documentSave.get("SEQ");
			int seq = Integer.parseInt(tempSeq);

			String title = documentSave.get("TITLE");
			String content = documentSave.get("CONTENT");

			String tempRegistDate = documentSave.get("REGIST_DATE");
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy.MM.dd HH:mm:ss", Locale.KOREA);
			Date registDate = dateFormat.parse(tempRegistDate);

			String tempHit = documentSave.get("HIT");
			int hit = Integer.parseInt(tempHit);

			System.out.println("글번호 : " + seq);
			System.out.println("제목  : " + title);
			System.out.println("등록일 : " + registDate);
			System.out.println("조회수 : " + hit);
			System.out.println("내용 : " + content);
		}

	}
	

	private static void viewDocumentList()
			throws ParseException {
		for (int indexI = 0; indexI < documentList.size(); indexI++) {
			Map documentSave = documentList.get(indexI);

			String tempSeq = documentSave.get("SEQ");
			int seq = Integer.parseInt(tempSeq);

			String title = documentSave.get("TITLE");
			String content = documentSave.get("CONTENT");

			String tempRegistDate = documentSave.get("REGIST_DATE");
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy.MM.dd HH:mm:ss", Locale.KOREA);
			Date registDate = dateFormat.parse(tempRegistDate);

			String tempHit = documentSave.get("HIT");
			int hit = Integer.parseInt(tempHit);

			System.out.println("글번호 : " + seq);
			System.out.println("제목  : " + title);
			System.out.println("등록일 : " + registDate);
			System.out.println("조회수 : " + hit);
			System.out.println("내용 : " + content);

		}

	}

	private static void deleteDocument(String[] outputData) {
		// 사용자가 입력한 문서 번호 가져오기
		String userInputSeq = outputData[1];

		// 검사
		for (int indexI = 0; indexI < documentList.size(); indexI++) {
			Map checkDocument = documentList.get(indexI);
			if (userInputSeq.equals(checkDocument.get("SEQ"))) {
				documentList.remove(indexI);
				break;
			}
		}

		System.out.println("삭제 되었습니다");

	}

	private static void editDocumentForm(String[] outputData) throws ParseException {
		// 사용자가 입력한 문서 번호 가져오기
		String userInputSeq = outputData[1];

		// 일치할경우 저장할 Map타입
		Map documentSave = null;

		// 검사
		for (int indexI = 0; indexI < documentList.size(); indexI++) {
			Map checkDocument = documentList.get(indexI);
			if (userInputSeq.equals(checkDocument.get("SEQ"))) {
				documentSave = checkDocument;
				break;
			}
		}
		// null 경우 처리 하지 않음
		if (documentSave != null) {

			String tempSeq = documentSave.get("SEQ");
			int seq = Integer.parseInt(tempSeq);

			String title = documentSave.get("TITLE");
			String content = documentSave.get("CONTENT");

			String tempRegistDate = documentSave.get("REGIST_DATE");
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy.MM.dd HH:mm:ss", Locale.KOREA);
			Date registDate = dateFormat.parse(tempRegistDate);

			String tempHit = documentSave.get("HIT");
			int hit = Integer.parseInt(tempHit);

			System.out.println("글번호 : " + seq);
			System.out.println("제목  : " + title);
			System.out.println("등록일 : " + registDate);
			System.out.println("조회수 : " + hit);
			System.out.println("내용 : " + content);
		}

	}

	private static void editDocument(String[] outputData) {
		// 사용자가 입력한 문서 번호 가져오기
		String userInputSeq = outputData[1];

		// 일치할경우 저장할 Map타입
		Map documentSave = null;

		// 검사
		for (int indexI = 0; indexI < documentList.size(); indexI++) {
			Map checkDocument = documentList.get(indexI);
			if (userInputSeq.equals(checkDocument.get("SEQ"))) {
				documentSave = checkDocument;
				break;
			}
		}
		// null 경우 처리 하지 않음
		if (documentSave != null) {

			String userInputTitle = outputData[2];
			String userInputContent = outputData[3];

			documentSave.put("TITLE", userInputTitle);
			documentSave.put("CONTENT", userInputContent);

			Date systemDate = new Date();
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy.MM.dd HH:mm:ss", Locale.KOREA);
			String sysDate = dateFormat.format(systemDate);
			documentSave.put("REGIST_DATE", sysDate);

			System.out.println("수정완료 하였습니다");

		}

	}

}


'Programing > Java programing' 카테고리의 다른 글

3-3 메소드, 클래스 분리 회고  (0) 2010.07.26
3-2 클래스로 분리  (0) 2010.07.25
2-6 다음 진행을 위한 회고  (0) 2010.07.23
2-5 문서관리 (수정)  (0) 2010.07.22
2-4 문서관리 (삭제)  (0) 2010.07.22