제 13 주:
© J.-H. Kang, CNU
강 지 훈
jhkang@cnu.ac.kr충남대학교 컴퓨터공학과
객체의 표현 4
© J.-H. Kang, CNU
Model-View-Controller
Model-View-Controller 2
© J.-H. Kang, CNU
App 에서의 역할 구분
3
기업체 전체를
관장하고 통제한다
생산 기능을 수행한다 판매를 담당한다
공장 영업부
사장
© J.-H. Kang, CNU
App 에서의 역할 구분
4
App 전체를
관장하고 통제한다
핵심 두뇌 (생산)
기능을 수행한다 입출력을
담당한다
Model View
Controller
© J.-H. Kang, CNU
모든 프로그램은 MVC 형태로
성적처리
Model-View-Controller 5
App의 main()에서 하는 일 - 입력 지시를 내리고 결과
를 받아온다
- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력
지시를 내린다
학급(Ban): 성적처리 - 점수 관리
- 평균 계산
- 학점별 학생수 계산
입출력
- 키보드 입력
- 화면 출력
© J.-H. Kang, CNU
부하 직원이 상사 몰래?
Model-View-Controller 6
App의 main()에서 하는 일 - 입력 지시를 내리고 결과
를 받아온다
- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력
지시를 내린다
학급(Ban): 성적처리 - 점수 관리
- 평균 계산
- 학점별 학생수 계산
입출력
- 키보드 입력
- 화면 출력
© J.-H. Kang, CNU
MVC
Model-View-Controller 7
App의 main()에서 하는 일 - 입력 지시를 내리고 결과
를 받아온다
- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력
지시를 내린다
학급(Ban): 성적처리 - 점수 관리
- 평균 계산
- 학점별 학생수 계산
입출력
- 키보드 입력 - 화면 출력
Controller
Model View
© J.-H. Kang, CNU
각각을 class 로!
성적처리 프로그램
Controller: Class “AppController”
Model: Class “Ban”
View: Class “AppView”
Model-View-Controller 8
© J.-H. Kang, CNU
Class “AppView”
Model-View-Controller 9
© J.-H. Kang, CNU
공개 함수
public AppView() ; // 생성자 // 입력 관련 함수들
public boolean inputMoreStudentsExist() {...}
// 더 입력 받을 학생이 있는지 여부를 입력 받아 얻는다
public String inputStudentNo() {...} // 학번을 입력 받아 얻는다 public int inputScore() {...} 성적을 입력 받아 얻는다.
// 출력 관련 함수들
public void outputStudentInfo (Student aStudent) {...}
public void outputAverageInfo (double anAverage) {...}
public void outputGradeInfo
(char aGrade, int numberOfStudentsForGivenGrade) {...}
public void outputMessage (MessageID aMessageID) {...}
// type “MessageID” : enumeration type for messages // outputMessage (MessageID.Title_StudentListInfo) ; // outputMessage (MessageID.Title_AverageInfo) ; // outputMessage (MessageID.Title_GradeInfo) ;
// outputMessage (MessageID.Notice_EndOfProgram) ;
Model-View-Controller 10
© J.-H. Kang, CNU
[제 13 주 실습]
성적 처리
실습 11
© J.-H. Kang, CNU
단계별로 해결하자.
[프로그램 13-1]
문제는 [프로그램 12-2]와 동일
MVC 개념을 적용한다
[프로그램 13-2]
[프로그램 13-1]을 3과목 처리로 확장한다.
실습 12
© J.-H. Kang, CNU
[프로그램 13-1]
Model-View-Controller 개념 적용
실습 13
© J.-H. Kang, CNU
제 1 단계 [프로그램 13-1]
문제
문제 내용은 [프로그램 12-2]와 동일
프로그램 전체 구성에 Model-View-Controller 개념을 적용한다.
실습 14
© J.-H. Kang, CNU
입출력
입력
매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.
Yes 이면 한 학생의 학번과 점수를 입력 받는다.
성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.
No 이면 입력을 종료한다.
출력
입력된 학번과 점수와 그에 해당하는 학점을 출력한다.
마지막에 평균점과 평균 이상인 학생수를 출력한다.
실습 15
© J.-H. Kang, CNU
출력의 예
실습 16
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999
-점수를 입력하시오: 82
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888
-점수를 입력하시오: 45
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222
-점수를 입력하시오: 93
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555
- 점수를 입력하시오: 102
오류: 0보다 작거나 100 보다 커서, 정상적인 점수가 아닙니다.
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555
-점수를 입력하시오: 66
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333
-점수를 입력하시오: 87
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.
학생들의 성적 목록입니다.
학번: 201199999, 점수: 82, 학점: B 학번: 201188888, 점수: 45, 학점: F 학번: 201122222, 점수: 93, 학점: A 학번: 201155555, 점수: 66, 학점: D 학번: 201133333, 점수: 87, 학점: B 평균점수는 74.6 입니다.
평균 이상인 학생의 성적은 다음과 같습니다.
학번: 201199999, 점수: 82, 학점: B 학번: 201122222, 점수: 93, 학점: A 학번: 201133333, 점수: 87, 학점: B A 학점은 모두 1 명 입니다.
B 학점은 모두 2 명 입니다.
C 학점은 모두 0 명 입니다.
D 학점은 모두 1 명 입니다.
F 학점은 모두 1 명 입니다.
프로그램을 종료합니다.
© J.-H. Kang, CNU
main()
실습 17
© J.-H. Kang, CNU
main()은 어떻게?
// App에서 필요로 하는 상수를 포함한 어떠한 변수도 선언하지 않는다 // 이제 필요한 모든 것은 Class ”AppController” 안에 선언한다
// main에는 단지 아래의 코드만 필요하다.
public static void main (String[] args)
{ AppController appController = new AppController() ;
appController.run() ; // 여기에서는 앱이 실행되도록 해주는 일이 전부이다.
}
실습 18
© J.-H. Kang, CNU
Class “AppController”
실습 19
© J.-H. Kang, CNU
Class "AppController" 의 구현 [1]
public class AppController { // 비공개 상수/변수들
private static final int MAXSTUDENTS = 50 ; private AppView _appView ;
private Scanner _scanner ; private Ban _ban ;
// 생성자
public App ()
{ this._appView = new AppView() ;
this._scanner = new Scanner(System.in) ; this._ban = new Ban(MAXSTUDENTS) ; }
// 비공개함수의 구현 ...
// 공개함수의 구현 ...
}
실습 20
_scanner는 왜
삭제되는가?
© J.-H. Kang, CNU
Class "AppController" 의 구현: run()
public class AppController { // 비공개 상수/변수들 ...
// 생성자
public AppController () ...
// 비공개함수의 구현 ...
// 공개함수의 구현 public void run()
{
this.inputAndStoreStudentsInfo() ; // (1) 학생 정보를 입력 받는다 // 이 시점에 모든 학생 정보는 this._ban 이 소유한다.
this.showStudentListInfo() ; // (2) 입력 받은 학생 정보를 출력한다.
this._ban.calcAverage() ; // (3-1) 평균과 평균 이상인 학생수를 계산하고
this.showAverageInfo() ; // (3-2) 결과를 출력한다.this._ban.countStudentsByGrade() ; // (4-1) 학생들의 학점을 조사, 학점 별 학생수 를 센다.
this.showGradeInfo() ; //(4-2) 그 결과를 출력한다.
// System.out.println(“프로그램을 종료합니다.”) ;
this._appView.outputMessage(MessageID.Notice_EndOfProgram) ; } }
실습 21
© J.-H. Kang, CNU
Class "AppController" : 비공개 함수
private void inputAndStoreStudentsInfo() {…} // 학생 정보를 입력 받는다
private void showStudentListInfo() {…} // 입력 받은 학생 정보를 출력한다.
private void showAverageInfo() {…} // 평균 정보를 출력한다
private void showGradeInfo() {…} // 학점 정보를 출력한다
실습 22
© J.-H. Kang, CNU
showStudentListInfo()
private void showStudentListInfo() {
// System.out.println(“학생들의 성적 목록입니다.”);
this._appView.outputMessage(MessageID.Title_StudentListInfo) ;
Student aStudent = null ;
for ( int i = 0 ; i< this._ban.numberOfStudents() ; i++ ) { aStudent = this._ban.studentWithOrderOf(i) ;
// System.out.println(“학번: “+aStudent.studentNo()+…) ;
this._appView.outputStudentInfo(aStudent);} }
23
© J.-H. Kang, CNU
Class “AppView”
실습 24
© J.-H. Kang, CNU
public class AppView { // 비공개 상수/변수들
private Scanner _scanner ; // 생성자
public AppView ()
{ this._scanner = new Scanner(System.in) ; }
// 공개함수의 구현 ...
}
25
© J.-H. Kang, CNU
Class "AppView" 의 구현
public class AppView { // 비공개 상수/변수들 ...
// 생성자 ...
// 공개함수의 구현
public boolean inputMoreStudentsExist() { ... // 여기를 채우시오
}
public int inputScore() { ... // 여기를 채우시오 }
public String inputStudentNo() { ... // 여기를 채우시오
}
26
© J.-H. Kang, CNU
Class "AppView" 의 구현
출력 관련 함수들
public void outputStudentInfo (Student aStudent) { ... // 여기를 채우시오
}
public void outputAverageInfo (double aClassAverage) { ... // 여기를 채우시오
}
public void outputGradeInfo
(char aGrade, int numberOfStudentsForGivenGrade) { ... // 여기를 채우시오
}
public void outputMessage (MessageID aMessageID) { ... // 여기를 채우시오
}
27
© J.-H. Kang, CNU
Enum “MessageID”
실습 28
© J.-H. Kang, CNU
Enum "MessageID"
public enum MessageID {
// message IDs for Errors:
Error_ScoreOutOfRange, Error_NoInputOfStudents, // Message IDs for Titltes:
Title_SutdentsInfo, Title_AverageInfo, Title_GradingInfo,
// Message IDs for Notices:
Notice_EndOfProgram, } //End of enum “MessageID”
29
© J.-H. Kang, CNU
[프로그램 13-2]
3 과목 처리하기
실습 30
© J.-H. Kang, CNU
제 2 단계 [프로그램 13-2]
문제
[프로그램 13-1]에서는 한번에 하나의 점수만 입력받았 다.
여기서는 한번에 3 과목의 점수를 입력 받는다.
과목은 Korean, English, Computer
각 학생에 대해,
각 과목의 학점을 계산한다.
각 학점을 평점으로 환산한다.
세 과목의 평점의 평균, 즉 평균평점을 계산한다.
전체 학급에 대해,
학급의 평균평점, 즉 학생들의 평균 평점의 평균을 구한다.
학급 평균 평점 이상인 학생의 수를 구한다.
실습 31
© J.-H. Kang, CNU
입출력
입력:
매번 학번과 성적을 입력할지 (Yes/No) 여부를 먼저 묻는다.
Yes 이면 한 학생의 학번과 각 과목의 점수를 입력 받는다.
성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입력을 다
시 받는다.
No 이면 입력을 종료한다.
출력
입력된 학번과 점수와 그에 해당하는 학점을 출력한다.
평균점과 평균 이상인 학생의 학생 정보를 출력한다.
마지막에 학점 별 학생수를 출력한다.
실습 32
© J.-H. Kang, CNU
출력의 예
실습 33
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201199999
- 국어 점수를 입력하시오: 82 - 영어 점수를 입력하시오: 77 - 컴퓨터 점수를 입력하시오: 90
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201188888
- 국어 점수를 입력하시오: 45 - 영어 점수를 입력하시오: 66 - 컴퓨터 점수를 입력하시오: 88
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201122222
- 국어 점수를 입력하시오: 93 - 영어 점수를 입력하시오: 156
[오류] 정상 범위 (0~100)의 점수가 아닙니다. 다시 입력하시오.
- 영어 점수를 입력하시오: 56 - 컴퓨터 점수를 입력하시오: 72
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201155555
- 국어 점수를 입력하시오: 102
[오류] 정상 범위 (0~100)의 점수가 아닙니다. 다시 입력하시오.
- 국어 점수를 입력하시오: 66 - 영어 점수를 입력하시오: 85 - 컴퓨터 점수를 입력하시오: -1
[오류] 정상 범위 (0~100)의 점수가 아닙니다. 다시 입력하시오.
- 컴퓨터 점수를 입력하시오: 20
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: Y - 학번을 입력하시오: 201133333
- 국어 점수를 입력하시오: 87 - 영어 점수를 입력하시오: 95 - 컴퓨터 점수를 입력하시오: 99
? 학생정보를 입력하려면 ‘Y’를 , 입력을 종료하려면 ‘N’을 치시오: N 입력을 종료합니다.
학생수는 모두 5 명입니다.
학생들의 성적 목록입니다.
학번: 201199999, 국어: 82(B), 영어: 77(C), 컴퓨터: 90(A), 평균평점: 3.0 학번: 201188888, 국어: 45(F), 영어: 66(D), 컴퓨터: 88(B), 평균평점: 1.3 학번: 201122222, 국어: 93(A), 영어: 56(F), 컴퓨터: 72(C), 평균평점: 2.0 학번: 201155555, 국어: 66(D), 영어: 85(B), 컴퓨터: 20(F), 평균평점: 1.3 학번: 201133333, 국어: 87(B), 영어: 95(A), 컴퓨터: 99(A), 평균평점: 3.7 학급의 평균평점은 2.27 입니다.
평균평점 이상인 학생수는 2 명 이상입니다.
프로그램을 종료합니다.
© J.-H. Kang, CNU
Class Student
public class Student {
private Subject _korean ; private Subject _english ;
private Subject _computer ; private double _GPA ;
public Student() { ...
}
public void setKorean(Subject aSubject) { ... } public Subject korean() { ...}
public void setEnglish(Subject aSubject) { ... } public Subject english() { ...}
public void setComputer(Subject aSubject) { ... } public Subject computer() { ...}
pubic void setGPA (double aGPA) {...}
public double GPA() {...}
} // End of class “Student”
실습 34
© J.-H. Kang, CNU
Class Subject
public class Subject { private int _score ; public Subject() {...}
public void setScore(int aScore) { ... } public int score {...}
public char grade {...}
public double point {...}
} End of class “Subject”
실습 35
© J.-H. Kang, CNU
Class Ban
public class Ban {
private int _maxNumberOfStudents ; private int _numberOfStudents ;
private Student[] _students ;
private double _classAverageGPA ;
private int _numberOfStudentsAboveAverageGPA ; public Ban (int givenMaxNumberOfStudents) {...}
public boolean isFull() {...}
public boolean isEmpty() {...}
public int maxNumberOfStudents() {...}
public int numberOfStudents() {...}
public double classAverageGPA() {...}
public int numberOfStudentsAboveAverageGPA() {...}
public boolean addStudent(Student aStudent) {...}
public Student studentWithOrderOf (int order) {...}
public boolean processScores() {...}
} End of class “Ban”
실습 36
© J.-H. Kang, CNU
Class AppController
public class AppController {
private AppView _appView = null ; // View 객체 private Ban _ban = null ; // Model 객체 ...
public AppController() {...}
// 공개함수의 구현 public void run ()
{
// (1) 학생 정보를 입력 받는다 this.inputAndStoreStudentInfo() ;
// 이 시점에 모든 학생 정보, 즉 학급 정보는 this._ban 이 소유한다.
if ( this._ban.isEmpty() ) { // 입력된 학생이 없으면
this._appView.outputMessage(MessageID.Error_NoInputOfStudents) ;
} else {
// (2) 학생 정보를 출력한다.
this.showStudentInfo() ;
// (3) 학급평균평점과 평균 이상인 학생수를 _ban에게 계산하도록 시키고, // 결과를 출력한다.
this._ban.processScores() ; this.showAverageInfo() ;
//(4)학급의평점 정보를 출력한다.
this.showGradeInfo() ;
this._appView.outputMessage(MessageID.Notice_EndOfProgram) ;
}
}실습 37
© J.-H. Kang, CNU
Class "AppView" 의 구현
출력 관련 함수들
public void outputStudentInfo (Student aStudent) { ... // 여기를 채우시오
}
public void outputAverageInfo
(double aClassAverage, int numberOfStudentsAboveAverageGPA) { ... // 여기를 채우시오
}
public void outputGradeInfo
(char aGrade, int numberOfStudentsForGivenGrade) { ... // 여기를 채우시오
}
public void outputMessage (MessageID aMessageID) { ... // 여기를 채우시오
}
38
© J.-H. Kang, CNU
실행하기
먼저 슬라이드에 나온 결과 화면 데이터를 사용하 여 동일한 결과가 나오는 것을 보인다.
그 다음, 각자 임의대로 테스트 데이터를 20명 이 상 준비하여 처리 한다.
데이터에는 모든 종류의 오류가 발생하도록 만든다.
이 두 가지 상황을 실행한 결과 화면을 capture 하 여 보고서에 포함시킨다.
실습 39
© J.-H. Kang, CNU
[제 13 주] 끝
40