JAVA

[JAVA] 예제 - 응집도와 결합도를 고려해 학생부 프로그램 만들기

yn98 2024. 7. 18. 10:15

전에는 ArrayList를 이용해서 학생부 프로그램을 만들었다.

https://yn98.tistory.com/29

 

[JAVA] 예제 - ArrayList를 이용하여 학생부 프로그램 만들기

예전에 학생부 프로그램을 예제로 만들어 본 적이 있었다.https://yn98.tistory.com/12 JAVA 함수를 이용해서 학생부 프로그램 만들기아래는 함수를 이용하지 않고 MAIN에다가 전부 입력해서 프로그램을

yn98.tistory.com

정보처리기사 공부를 하면서 응집도와 결합도의 중요성은 잘 알고 있었는데, 이를 신경써서 코드를 짜본 적은 없었다.

같은 주제의 예제를 하나하나 배우고 성장하면서 코드를 수정하는 식으로 하고있는데, 이렇게 하니까 습득력이 좋은 것 같다.

우선, MVC 패턴으로 코드를 먼저 짜봤는데, 블로그에 남겨놓은 줄 알고 수정했는데 알고보니 남겨놓지 않았어서 중간과정이 조금 생략돼있다.

 

패키지를 client / service.controller / service.model  / view 로 나누었다.

 

<client>

package client;

import service.controller.StudentController;

public class Client02 {
	public static void main(String[] args) {
		
		// 학생부 프로그램
		
		StudentController app = new StudentController();
		app.start();

	}
}

 

<service.controller>

package service.controller;

import java.util.ArrayList;

import service.model.StudentDAO;
import service.model.StudentDTO;
import view.StudentView;

public class StudentController {
	private StudentDAO model;
	private StudentView view;
	private int PK;
	public StudentController() {
		this.model=new StudentDAO();
		this.view=new StudentView();
		this.PK=104;
	}

	// 사용자(Client)에게 [M과 V를 조합해서] 서비스를 제공하는 역할
	public void start() {
		while(true) {
			view.print01();
			int action=view.inputAction();

			if(action==1) { // 1. 학생추가
				view.print02();
				String name=view.inputName();
				view.print03();
				int score=view.inputScore();
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setNum(PK++);
				studentDTO.setName(name);
				studentDTO.setScore(score);

				boolean flag=model.insert(studentDTO);
				if(flag) {
					view.print04();
				}
				else {
					// 실패했습니다.
				}
			}
			else if(action==2) {// 2. 전체출력
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setCondition("ALL");
				view.print05(model.selectAll(studentDTO));
			}
			else if(action==3) { // 3. 번호검색
				view.print07();
				int num=view.inputNum(PK);
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setNum(num);
				StudentDTO data = model.selectOne(studentDTO);			
				view.print08(data);			
			}
			else if(action==4) { // 이름검색
				view.print12();
				String searchKeyword=view.inputName();
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setName(searchKeyword);
				studentDTO.setCondition("SEARCH_NAME");
				ArrayList<StudentDTO> datas=model.selectAll(studentDTO);
				view.print13(datas);
			}
			
			else if(action==5) { // 평균출력
				
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setCondition("ALL");
				ArrayList<StudentDTO> datas=model.selectAll(studentDTO);

					
				// 데이터 정제, 가공
				int sum=0;
				for(StudentDTO data:datas) {
					sum+=data.getScore();
				}
				double avg=sum*1.0/datas.size();

				/*
				StudentDTO data=model.selectOne();
				double avg=data.getAvg();
				 */

				view.print14(avg);
			}
			else if(action==6) { // 점수변경
				view.print07();
				int num=view.inputNum(PK);
				view.print03();
				int score=view.inputScore();
				
				
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setNum(num);
				studentDTO.setScore(score);
				studentDTO.setCondition("SCORE");
				boolean flag=model.update(studentDTO);

				if(flag) {
					view.print15();
				}
				else {
					view.print16();
				}
			}
			else if(action==7) { // 7. 학생삭제
				view.print09();
				int num=view.inputNum(PK);
				
				StudentDTO studentDTO = new StudentDTO();
				studentDTO.setNum(num);
				boolean flag = model.delete(studentDTO);
				if(flag) {
					view.print10();
				}
				else {
					view.print11();
				}
			}
			else if(action==0) {
				break;
			}
		}
	}
}

 

<service.model> - StudentDTO

 

 

package service.model;

// MVC 패턴에서 data를 VO, DTO라고 함
public class StudentDTO {
	private int num;
	private String name;
	private String condition;
	private int score;
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "StudentDTO [num=" + num + ", name=" + name + ", score=" + score + "]";
	}
	public String getCondition() {
		return condition;
	}
	public void setCondition(String condition) {
		this.condition = condition;
	}
	
}

service.model - StudentDAO

package service.model;

import java.util.ArrayList;



//MVC 패턴에서 DBMS 파트를 DAO라고 함
public class StudentDAO {
	private ArrayList<StudentDTO> datas;
	// JAVA x ▷ MySQL, Oracle로 이동될 예정
	public StudentDAO() {
		System.out.println("    service.model.StudentDAO() StudentDAO()생성자 시작");
		datas = new ArrayList<StudentDTO>();
		//샘플 데이터
		StudentDTO data1 = new StudentDTO();
		data1.setNum(101);
		data1.setName("오리아나");
		data1.setScore(50);
		datas.add(data1);

		StudentDTO data2 = new StudentDTO();
		data2.setNum(102);
		data2.setName("모르가나");
		data2.setScore(89);	
		datas.add(data2);

		StudentDTO data3 = new StudentDTO();
		data3.setNum(103);
		data3.setName("티모");
		data3.setScore(67);
		datas.add(data3);
		System.out.println("    service.model.StudentDAO() StudentDAO()생성자 종료");
	}


	// CUD : output이 boolean

	public boolean insert(StudentDTO studentDTO) {
		StudentDTO data = new StudentDTO();
		data.setNum(studentDTO.getNum());
		data.setName(studentDTO.getName());
		data.setScore(studentDTO.getScore());
		this.datas.add(data);
		
		return true;
	}

	public boolean update(StudentDTO studentDTO) {
		if(studentDTO.getCondition().equals("SCORE")) {
			for(StudentDTO data : this.datas) {
				if(data.getNum() == studentDTO.getNum()) {
					data.setScore(studentDTO.getScore());
					return true;
				}
			}
		}
		return true;
	}
	public boolean delete(StudentDTO studentDTO) {
//		System.out.println("        service.model.StudentDAO delete() 시작 ");
		for(int i = 0; i<datas.size();i++) {
			if(datas.get(i).getNum() == studentDTO.getNum()) {
				datas.remove(i);
//				System.out.println("   service.model.StudentDAO  delete() 성공");
				return true;
			}
		}
//		System.out.println("   service.model.StudentDAO  delete() 실패");
		return false;
	}


	// R : output이 여러개인경우AL, 하나인경우DTO
	public ArrayList<StudentDTO> selectAll(StudentDTO studentDTO) {
//		System.out.println("    service.model.StudentDAO() selectAll()");
		ArrayList<StudentDTO> datas = new ArrayList<StudentDTO>();
		if(studentDTO.getCondition().equals("ALL")) {
			for(StudentDTO data : this.datas) {
				datas.add(data);
			}
		}
		else if(studentDTO.getCondition().equals("SEARCH_NAME")) {
			for(StudentDTO data : this.datas) {
				if(data.getName().contains(studentDTO.getName())) {
					datas.add(data);
				}
			}
		}
		return datas;
	}

	public StudentDTO selectOne(StudentDTO studentDTO) {
//		System.out.println("    service.model.StudentDAO() selectOne() 시작");
		for(StudentDTO data : this.datas) {
			if(data.getNum() == studentDTO.getNum()) {
//				System.out.println("    service.model.StudentDAO() selectOne() 데이터 일치");
				return data;
			}
		}
//		System.out.println("    service.model.StudentDAO() selectOne() 데이터 불일치");
		return null;		
	}


}

 

view - StudentView

 

package view;

import java.util.ArrayList;
import java.util.Scanner;

import service.model.StudentDTO;

public class StudentView {
	static Scanner sc=new Scanner(System.in);

	public void print01() {
		System.out.println("=== 메 뉴 ===");
		System.out.println("1. 학생추가");
		System.out.println("2. 전체출력");
		System.out.println("3. 번호검색");
		System.out.println("4. 이름검색");
		System.out.println("5. 평균출력");
		System.out.println("6. 점수변경");
		System.out.println("7. 학생삭제");
		System.out.println("0. 프로그램 종료");
		System.out.println("==========");
	}
	public void print02() {
		System.out.print("추가할 학생의 이름 입력 >> ");
	}
	public void print03() {
		System.out.print("추가할 학생의 성적 입력 >> ");
	}
	public void print04() {
		System.out.println("학생 추가 완료!");
	}
	public void print05(ArrayList<StudentDTO> datas) {
		System.out.println("=== 전체 목록 ===");
		for(StudentDTO data:datas) {
			System.out.println(data);
		}
		System.out.println("===============");
	}
	public void print06() {
		System.out.println("출력할 데이터가 없습니다!");
	}
	public void print07() {
		System.out.print("검색할 학생의 번호 입력 >> ");
	}
	public void print08(StudentDTO data) {
		if(data==null) {
			System.out.println("검색 결과가 없습니다!");
			return;
		}

		System.out.println("=== 검색 결과 ===");
		System.out.println(data);
		System.out.println("===============");
	}
	public void print09() {
		System.out.print("삭제할 학생의 번호 입력 >> ");
	}
	public void print10() {
		System.out.println("학생 삭제 완료!");
	}
	public void print11() {
		System.out.println("학생 삭제 실패...");
		System.out.println("관리자에게 문의하세요.");
	}
	public void print12() {
		System.out.print("검색할 이름 입력 >> ");
	}
	public void print13(ArrayList<StudentDTO> datas) {
		if(datas.size() <= 0) {
			System.out.println("검색 결과가 없습니다!");
			return;
		}

		System.out.println("=== 검색 결과 ===");
		for(StudentDTO data:datas) {
			System.out.println(data);
		}
		System.out.println("===============");
	}
	public void print14(double avg) {
		// 학생이 많아질수록, 성적이 다양해질수록, V에 로직이 있으면 느려질것으로 예상
		// 평균 로직을 백단에 위치시킬예정
		System.out.println("전체 평균은 "+avg+"점 입니다.");
	}
	// 1. V  ex) 쿠팡의 총합금액 로직 등은 V에 위치함
	// 2. M vs C  ex) 오피지지의 승률픽률 로직 등은 백단에 위치함(C)
	public void print15() {
		System.out.println("학생 점수 변경 완료!");
	}
	public void print16() {
		System.out.println("학생 점수 변경 실패...");
		System.out.println("관리자에게 문의해주세요!");
	}

	
	
	public int inputAction() {
		int action=sc.nextInt();
		return action;
	}
	public String inputName() {
		String name=sc.next();
		return name;
	}
	public int inputScore() {
		int score=sc.nextInt();
		return score;
	}
	public int inputNum(int lastPK) {
		int num;
		while(true) {
			num=sc.nextInt();
			if(100 < num && num < lastPK) {
				break;
			}
			System.out.println("제대로 입력해주세요!");
		}
		return num;
	}
}

 

 

위 코드를 실행시켜서 일부만 입력해봤다.

 

잘 나오는 것을 알 수 있다.