JAVA
[JAVA] 예제 - 응집도와 결합도를 고려해 학생부 프로그램 만들기
yn98
2024. 7. 18. 10:15
전에는 ArrayList를 이용해서 학생부 프로그램을 만들었다.
[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;
}
}
위 코드를 실행시켜서 일부만 입력해봤다.
잘 나오는 것을 알 수 있다.