• 검색 결과가 없습니다.

객체의 표현 4

N/A
N/A
Protected

Academic year: 2022

Share "객체의 표현 4"

Copied!
40
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

제 13 주:

© J.-H. Kang, CNU

강 지 훈

jhkang@cnu.ac.kr

충남대학교 컴퓨터공학과

객체의 표현 4

(2)

© J.-H. Kang, CNU

Model-View-Controller

Model-View-Controller 2

(3)

© J.-H. Kang, CNU

 App 에서의 역할 구분

3

기업체 전체를

관장하고 통제한다

생산 기능을 수행한다 판매를 담당한다

공장 영업부

사장

(4)

© J.-H. Kang, CNU

 App 에서의 역할 구분

4

App 전체를

관장하고 통제한다

핵심 두뇌 (생산)

기능을 수행한다 입출력을

담당한다

Model View

Controller

(5)

© J.-H. Kang, CNU

 모든 프로그램은 MVC 형태로

 성적처리

Model-View-Controller 5

App의 main()에서 하는 일 - 입력 지시를 내리고 결과

를 받아온다

- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력

지시를 내린다

학급(Ban): 성적처리 - 점수 관리

- 평균 계산

- 학점별 학생수 계산

입출력

- 키보드 입력

- 화면 출력

(6)

© J.-H. Kang, CNU

 부하 직원이 상사 몰래?

Model-View-Controller 6

App의 main()에서 하는 일 - 입력 지시를 내리고 결과

를 받아온다

- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력

지시를 내린다

학급(Ban): 성적처리 - 점수 관리

- 평균 계산

- 학점별 학생수 계산

입출력

- 키보드 입력

- 화면 출력

(7)

© J.-H. Kang, CNU

 MVC

Model-View-Controller 7

App의 main()에서 하는 일 - 입력 지시를 내리고 결과

를 받아온다

- 성적처리 지시를 내린다 - 성적처리 결과를 받아온다 - 출력정보를 제공하여 출력

지시를 내린다

학급(Ban): 성적처리 - 점수 관리

- 평균 계산

- 학점별 학생수 계산

입출력

- 키보드 입력 - 화면 출력

Controller

Model View

(8)

© J.-H. Kang, CNU

 각각을 class 로!

 성적처리 프로그램

 Controller: Class “AppController”

 Model: Class “Ban”

 View: Class “AppView”

Model-View-Controller 8

(9)

© J.-H. Kang, CNU

Class “AppView”

Model-View-Controller 9

(10)

© 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

(11)

© J.-H. Kang, CNU

[제 13 주 실습]

성적 처리

실습 11

(12)

© J.-H. Kang, CNU

 단계별로 해결하자.

 [프로그램 13-1]

 문제는 [프로그램 12-2]와 동일

 MVC 개념을 적용한다

 [프로그램 13-2]

 [프로그램 13-1]을 3과목 처리로 확장한다.

실습 12

(13)

© J.-H. Kang, CNU

[프로그램 13-1]

Model-View-Controller 개념 적용

실습 13

(14)

© J.-H. Kang, CNU

 제 1 단계 [프로그램 13-1]

 문제

 문제 내용은 [프로그램 12-2]와 동일

 프로그램 전체 구성에 Model-View-Controller 개념을 적용한다.

실습 14

(15)

© J.-H. Kang, CNU

 입출력

 입력

 매번 학번과 성적을 입력 받을지 (Yes/No) 여부를 먼저 묻는다.

 Yes 이면 한 학생의 학번과 점수를 입력 받는다.

성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입 력은 무시한다.

 No 이면 입력을 종료한다.

 출력

 입력된 학번과 점수와 그에 해당하는 학점을 출력한다.

 마지막에 평균점과 평균 이상인 학생수를 출력한다.

실습 15

(16)

© 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 명 입니다.

프로그램을 종료합니다.

(17)

© J.-H. Kang, CNU

main()

실습 17

(18)

© J.-H. Kang, CNU

 main()은 어떻게?

// App에서 필요로 하는 상수를 포함한 어떠한 변수도 선언하지 않는다 // 이제 필요한 모든 것은 Class ”AppController” 안에 선언한다

// main에는 단지 아래의 코드만 필요하다.

public static void main (String[] args)

{ AppController appController = new AppController() ;

appController.run() ; // 여기에서는 앱이 실행되도록 해주는 일이 전부이다.

}

실습 18

(19)

© J.-H. Kang, CNU

Class “AppController”

실습 19

(20)

© 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는 왜

삭제되는가?

(21)

© 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

(22)

© J.-H. Kang, CNU

 Class "AppController" : 비공개 함수

private void inputAndStoreStudentsInfo() {…} // 학생 정보를 입력 받는다

private void showStudentListInfo() {…} // 입력 받은 학생 정보를 출력한다.

private void showAverageInfo() {…} // 평균 정보를 출력한다

private void showGradeInfo() {…} // 학점 정보를 출력한다

실습 22

(23)

© 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

(24)

© J.-H. Kang, CNU

Class “AppView”

실습 24

(25)

© J.-H. Kang, CNU

public class AppView { // 비공개 상수/변수들

private Scanner _scanner ; // 생성자

public AppView ()

{ this._scanner = new Scanner(System.in) ; }

// 공개함수의 구현 ...

}

25

(26)

© J.-H. Kang, CNU

 Class "AppView" 의 구현

public class AppView { // 비공개 상수/변수들 ...

// 생성자 ...

// 공개함수의 구현

public boolean inputMoreStudentsExist() { ... // 여기를 채우시오

}

public int inputScore() { ... // 여기를 채우시오 }

public String inputStudentNo() { ... // 여기를 채우시오

}

26

(27)

© 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

(28)

© J.-H. Kang, CNU

Enum “MessageID”

실습 28

(29)

© 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

(30)

© J.-H. Kang, CNU

[프로그램 13-2]

3 과목 처리하기

실습 30

(31)

© J.-H. Kang, CNU

 제 2 단계 [프로그램 13-2]

 문제

 [프로그램 13-1]에서는 한번에 하나의 점수만 입력받았 다.

 여기서는 한번에 3 과목의 점수를 입력 받는다.

과목은 Korean, English, Computer

 각 학생에 대해,

각 과목의 학점을 계산한다.

각 학점을 평점으로 환산한다.

세 과목의 평점의 평균, 즉 평균평점을 계산한다.

 전체 학급에 대해,

학급의 평균평점, 즉 학생들의 평균 평점의 평균을 구한다.

학급 평균 평점 이상인 학생의 수를 구한다.

실습 31

(32)

© J.-H. Kang, CNU

 입출력

 입력:

매번 학번과 성적을 입력할지 (Yes/No) 여부를 먼저 묻는다.

Yes 이면 한 학생의 학번과 각 과목의 점수를 입력 받는다.

성적이 0보다 작거나 100 보다 크면 오류메시지를 내보내고, 입력을 다

시 받는다.

No 이면 입력을 종료한다.

 출력

입력된 학번과 점수와 그에 해당하는 학점을 출력한다.

평균점과 평균 이상인 학생의 학생 정보를 출력한다.

마지막에 학점 별 학생수를 출력한다.

실습 32

(33)

© 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 명 이상입니다.

프로그램을 종료합니다.

(34)

© 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

(35)

© 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

(36)

© 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

(37)

© 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

(38)

© 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

(39)

© J.-H. Kang, CNU

 실행하기

 먼저 슬라이드에 나온 결과 화면 데이터를 사용하 여 동일한 결과가 나오는 것을 보인다.

 그 다음, 각자 임의대로 테스트 데이터를 20명 이 상 준비하여 처리 한다.

 데이터에는 모든 종류의 오류가 발생하도록 만든다.

 이 두 가지 상황을 실행한 결과 화면을 capture 하 여 보고서에 포함시킨다.

실습 39

(40)

© J.-H. Kang, CNU

[제 13 주] 끝

40

참조

관련 문서

8 No attenuation of light by semi-transparent metal electrodes, 8 Absorption of wave-guided light is dramatically reduced through. the use of highly reflective metallization

Wald-Type Tests for Detecting Breaks in The Trend Function of a Dynamic

In particular the earlier the first exposure time of obscene media is the higher labeling type, depressive type, aggressive type, and socialized type

Ⅳ, PatridoidⅤ라 이름 붙었다. Compound 4, 5는 Sesquilignan, dibenzylbutyrolactone type 이다. Compound 4, Sesquilignan-Lappaol E 이며, 이미 Arctium Arctium Arctium

3. Specially, Va type these a lot of changes were seen. Va type and Ⅶ type were shown big change after 4 months. Depilation number increases if depilation is gone or it is

connection type abutment had larger marginal gap than the external-hex connection type abutment, it is more difficult to make customized abutment of the internal-hex

Other Nucleic_acid Lipid steroid, Other lipid carbohydrate type of carbohydrate Substance-Atom type of

-another type of stereoisomer when Compound having carbon (chiral carbon) with 4 different groups attached carbon (chiral carbon) with 4 different groups