• 검색 결과가 없습니다.

객체의 표현 1

N/A
N/A
Protected

Academic year: 2022

Share "객체의 표현 1"

Copied!
104
0
0

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

전체 글

(1)

제 10 주:

객체의 표현 1

(2)

객체의 표현

- 객체 인식하기 -

(3)

 객체 (Objects)

 컴퓨터로 문제를 풀려면?

 문제에 등장하는 여러 대상들이 있다.

이차 방정식에서는 3 개의 계수들이.

Factorial 계산에서는 입력 정수 값 n 이.

 바로 이러한 대상들을 객체(Object)라고 한다.

성 이름

성명

2차항계수 1차항계수 상수항계수

이차방정식

입력값

factorial

(4)

 객체 (Objects)

 간단한 객체 유형들과 그 속성

년 월 일

일자

이름

성명

성명 주소 전화번호

개인

학번 성적

학생

(5)

 객체 (Objects)

 문제가 복잡해지면,

 보다 많은 객체들이 존재하게 되며,

 객체 하나 하나가 많은 속성(attribute)을 갖게 된다.

바퀴 엔진 변속기 트렁크

자동차

기통수 배기량 사용연료

...

엔진

(6)

 객체 (Objects)

 객체의 속성도 또한 객체일수도...

 작은 객체가 모여서 더 큰 객체로.

문 바퀴

변속기 트렁크

...

자동차

기통수 배기량 사용연료

...

엔진

(7)

 객체 (Objects)

 그러므로, 문제를 풀기 위해서는,

 우리가 파악해야 할 객체가 무엇인지?

 파악된 객체는 컴퓨터 안에 어떻게 효과적으로 표현 (저 장) 해야 하는지?

 또한, 그 객체를 가지고 어떤 일(계산)을 해야 하는지?

(8)

 객체 (Objects)

 예제: 이차방정식 풀이

이차방정식

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

x1 = (-b + sqrt(b*b-4.0*a*c)) / (2.0*a) ; x2 = (-b + sqrt(b*b-4.0*a*c)) / (2.0*a) ;

(9)

 객체(object)와 속성(attribute)

 이차방정식 문제:

 3 개의 계수는 3 개의 객체?

앞의 실습에서는 3 개의 독립된 객체로 취급되었다.

 하나의 객체?

 “이차식” 이라는 객체(object)가 있고,

 3 개의 계수는 이 객체의 “2차항 계수”, “1차항 계수”,

“상수 항 계수”라는 속성(attribute).

 이차식: (2차항 계수, 1차항 계수, 상수항 계수)

(10)

 객체와 객체와 직결된 기능

 모든 객체는,

 어떤 대상을 표현한다.

 그 표현된 대상과 직결된 할 일이 존재하게 된다.

예: 이차방정식의 해 구하기

 2차항의 계수가 0 인지를 판단한다.

 판별식의 값이 0 보다 작은지를 판단한다.

 이차방정식의 실근을 근의 공식을 사용하여 계산한다.

 그러므로, 직결된 할 일이 무엇인지를 파악하는 것 이 또한 중요하다.

 객체의 사용하는 사람 (사용자)의 관점은?

 객체를 만드는 사람 (구현자)의 관점은?

(11)

 객체 사용자는 어떻게 ?

 객체의 내부 구조나 속성을 알고 싶을까?

 TV는 그 내부가 매우 복잡한 객체

 TV 사용자는 TV 객체 내부의 복잡한 전자적/기계적 구

조나 속성을 알고 싶을까?

(12)

 객체 사용자는 어떻게 ?

 사용자는 단지 TV 객체를 쉽게 사용하기를 원할 뿐!

 전원 스위치로 켜고 끈다

 볼륨 스위치로 소리 크기를 조절한다

 채널 스위치로 원하는 채널을 선택한다

(13)

 객체 사용자는 어떻게 ?

 리모콘의 역할은?

 사용자에게 TV 객체의 내부를 알 필요 없이 편리하게 TV 시청을 하게 해 준다.

 리모콘의 각각의 단추가 TV 를 쉽고 편리하게 사용하

도록 만들어 준다.

(14)

 객체 구현자는 어떻게 ?

 구현자는 TV 객체를 사용하기 쉽고 편하고, 성능 좋고, 싸게 만들어야 한다!

 TV 제조회사(구현자)는 사용자의 요구 사항에 맞도록 그 내부의 전자적/기계적 구조를 설계하고 만들어야 한다.

 사용법이 바뀌지 않으면서, 지속적으로 성능을 혁신시킨

다.

(15)

 요약

 문제를 풀기 위해서는,

 필요한 객체들은?

 사용자의 관점에서:

객체의 쉽고 편한 사용법은?

 구현자의 관점에서:

객체의 속성은?

좋은 성능을 내기 위한 객체의 내부 구조는?

사용자가 쉽고 편하게 사용하도록 하기 위해, 객체가 해야 할 일

은?

(16)

Java 에서의 객체

(17)

 문제

 학생들의 학번과 성적을 키보드로부터 읽어 들인 다.

 학번은 크기 10 인 문자열이다.

학번을 구성하는 문자의 개수가 9개이다.

 성적은 100점 만점의 정수형 점수이다.

0점부터 100점까지 사이의 정수이다.

 학생의 성적이 60점 이상이면 “통과”, 60점 미만이 면 “실패”로 판정한다.

 학생 개인마다 학번과 성적과 판정을 출력한다.

(18)

객체 사용자의 관점은?

(19)

 필요한 객체는?

 학생

Student:

(20)

 학생 객체의 사용법은?

Student:

학번을 부여한다 학번을 얻어낸다 성적을 부여한다 성적을 얻어낸다

합불 판정을 얻어낸다

(21)

Student:

 객체는 언제나 리모콘으로만!

 Student가 TV라면, 리모콘은?

학번을 부여한다

학번을 얻어낸다

성적을 부여한다

성적을 얻어낸다

(22)

 객체 사용법은 공개함수로!

 공개함수 (public functions / public methods)

 리모콘 단추 하나가 한 개의 공개함수

Student:

setStudentNo(String aStudentNo) String studentNo()

void setScore(int aScore) int score()

char grade()

(23)

 객체는 Java에서 어떻게 나타낼 수 있을까?

 일반 변수를 다시 생각해보자.

double d ;

 변수 d 역시 하나의 객체로 생각할 수 있다.

 그 자료형이 double 이다.

 직결된 연산:

+, -, *, / 과 같은 사칙연산

>, <, ==, != 과 같은 비교연산

이런 연산이 항상 모두 필요한 것은 아니다.

이러한 연산이 결합된 복잡한 계산일 수도 있다.

 판별식의 계산

(24)

 일반적인 객체의 표현은?

 kim이라는 학생을 위한 학생정보는?

 우리는 이렇게 하고 표현하고 싶다.

Student kim ;

(cf.) double d ;

kim은 하나의 객체 변수이다.

모든 객체는 Java 에서 변수로 표현하게 된다.

 그 자료형이 Student 이다.

_studentNo: “20119999”

_score: 87 _grade: ‘P’

Student: kim

(25)

 Class: 객체의 자료형

 그렇다면, 자료형 Student는 Java에서 어떻게 표 현?

 다양한 객체의 형태가 미리 정의되어 존재할 수는 없다.

int, double, char와 같이 가장 기본적인 것만 미리 존재한다.

 우리가 자료형을 만들어 (정의하여) 사용한다.

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

...

(26)

 객체는 Class 로

 class는 하나의 자료형 (추상자료형)

 class 에는 “객체의 속성” 이 포함되게 된다.

 나중에 좀 더 자세히...

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; ...

}

(27)

 객체의 자료형은 class 이름으로

 Class 에 이름을 부여하자.

 Student 객체들을 위한 Student class

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

...

(28)

 Class 의 선언

 그러므로, 다음과 같이 선언된다.

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; ...

}

(29)

 객체의 속성은 private으로

 왜 속성은 private으로 선언할까?

 사용자는 객체에게 일을 어떻게 시키면 좋을까?

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

...

(30)

 완성된 class 인가?

 아직은...

 객체는 해야 할 일이 있다.

 TV 리모콘의 각각의 단추가 눌러졌을 때 해야 할 일

 그 일도 함께 class 안에 정의해야 한다.

 어떻게?

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; ... // 이곳에는?

}

(31)

 객체 변수 (Object Variable)

 이제 우리는 일단은, 객체 변수를 만들어 사용할 수 있다.

 일반 변수의 선언 방법과 마찬가지로.

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

// ... // 일단은 주석으로

}

(32)

 객체 변수가 바로 객체?

 객체 변수 kim의 선언으로 그림처럼 될까?

 마치 일반 변수처럼...

 즉, 객체 변수의 선언으로

객체가 바로 존재하게 될까?

_studentNo:

_score:

_grade:

Student: kim

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

// ...

}

Student kim ;

(33)

 변수 선언으로 객체는 만들어지지 않는다!

 객체 변수 kim의 선언의 결과는...

public class Student {

private String _studentNo ; private int _score ;

private char _grade ;

// ...

}

Student kim ;

_studentNo:

_score:

_grade:

실제 객체

kim

(34)

 객체를 생성시켜 보자 [1]

 객체 변수는 선언과 동시에 null로.

 즉, 현재 kim 은 아무 객체도 소유하고 있지 않다.

public class Student {

private String _studentNo ; private int _score ; private char _grade ; // 생성자

public Student() {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ; } // ...

}

Student kim = null ;

kim

(35)

 객체를 생성시켜 보자 [2]

 모든 객체는 “new”를 사용하여 생성시킨다.

public class Student {

private String _studentNo ; private int _score ; private char _grade ; // 생성자

public Student() {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ; } // ...

}

Student kim = null ; kim = new Student() ;

실제 객체

kim

(36)

 객체를 생성시켜 보자 [3]

 new()의 결과값은 객체의 소유권

 객체의 메모리 상의 주소값

public class Student {

private String _studentNo ; private int _score ; private char _grade ; // 생성자

public Student() {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ; } // ...

}

Student kim = null ; kim = new Student() ;

kim

_studentNo: null _score: 0

_grade: ‘ ’

실제 객체

(37)

 Class는 스스로 객체 생성 방법을 가지고 있어야 한다.

 생성자 (Constructor): Class 안에 함수로 정의

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student () {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ;

 객체의 생성은?

반드시

class 이름과 동일

(38)

 생성자는 사용자가 사용!

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student () {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ; }

// ...

}

 객체의 생성자는 반드시 public

반드시 public:

객체를 외부에서 사용(생성) 해야 하므로

(39)

 객체를 생성하고 그 소유권을 돌려준다.

 소유권: (또는 사용권)

실제로는 메모리에 생성된 객체의 주소값

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student () {

this._studentNo = null ; this._score = 0 ;

this._grade = ‘ ‘ ;

 객체의 생성자는 무엇을 돌려주는가?

돌려주는 값은 있 지만, 그 type은 명 시하지 않는다

(40)

 객체의 사용자는 어떻게 객체를 사용?

 객체의 사용자는 객체의 private 속성을 알지 못한 다.

kim ._score = 87 ; kim

?

_studentNo _score _grade

 _score 는 private

컴파일 오류

 사용자는 객체의 내부 속성

에 직접 접근 불가

(41)

 객체에게 일을 시킨다

 리모콘 단추 setScore()를 누른다.

 즉 객체의 사용자는 객체에 대해 직접 일을 하지 않고, 반드시 객체에게 시킨다.

 TV 리모콘을 생각해 보라

kim

kim . setScore (87) ;

(42)

 객체에게 일을 시킨다

 사용자는 공개함수를 사용하여 객체에게 일을 시 킨다.

kim

87

_studentNo _score _grade

kim . setScore (87) ;

Student 객체가 할 수 있는 일 일을 시킬 Student 객체를 소유한 객체변수

객체변수와 시킬 일 사이를

구분하는 점(dot)

(43)

객체의 구현자의 관점은?

(44)

 객체의 내부 구조는?

 학번 (_studentNo): 9개 문자를 저장할 수 있는 문 자열

 성적 (_score): 정수형

 학점 (_grade): 문자

 성적이 60점 이상이면 학점은 ‘P’의 값을, 60점 미만이면 ‘F’의 값을 갖는다.

_studentNo:

_score:

_grade:

Student:

(45)

 객체가 해야 할 일은?

 학번의 set / get

 성적의 set / get

 성적 합불 평가

성적을 판단하여, 통과/실패의 결과를 얻는다.

 합불 평가의 get

if (kim의 _score >= 60) kim의 _grade = ‘P’;

else

_studentNo: “20119999”

_score: 87

Student: kim

(46)

 Class 안에서의 사용법의 정의

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student() { ...

}

public void setScore (int aScore) { this._score = aScore ;

}

public int score () { return this._score ; }

}

성적의 setter

성적의 getter

(47)

 Class 안에서의 사용법의 정의

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student() { ...

}

public void setScore (int aScore) { ... // 여기에 실제 할 일을 }

사용자의

사용법이므로

반드시 public

(48)

 객체가 할 일의 구현

public class Student {

private String _studentNo ; private int _score ;

private char _grade ; // 생성자

public Student() { ...

}

public void setScore (int aScore) { this._score = aScore ;

}

public int score () { return this._score ; }

}

각 사용법에 대해,

객체가 실제로 할

(49)

 Class 안에서 속성의 사용법

 자신에게 일을 시킨 사용자가 지정한 객체를, 공개 함수가 인지하는 방법은?

public void setScore (int aScore ) { this ._score = aScore ;

}

kim

(50)

 Class 안에서 속성의 사용법

“this”

public void setScore (int aScore ) { this ._score = aScore ;

} kim

87

_studentNo _score _grade

일을 하도록 지시 받은 객체 자신을 가리킨다

“this” 표현은 객체 외부에서는 사용 불가

kim . setScore ( 87 ) ;

(51)

 Class 안에서 속성의 사용법

this._score

public void setScore (int aScore ) { this. _score = aScore ;

}

kim 일을 하도록 명령을 받은 객체가

가지고 있는 속성의 이름

(52)

객체의 인식, 그리고 표현

(53)

큰 것으로부터 작은 것을 !

(54)

 필요한 객체를 인식한다 [1]

 문제 해결에 필요한 객체가 무엇인지?

성명 일자

개인 학생

이차방정식 자동차

(55)

 필요한 객체를 인식한다 [2]

 문제 해결에 필요한 객체가 무엇인지?

 그 다음, 각 객체에 요구되는 속성은 무엇인지?

년 월 일 일자

이름 성명

학번 성적 학생

이차방정식

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴 자동차

기통수 배기량 사용연료

엔진

(56)

관점을 바꾸어 보자!

작은 것으로부터 큰 것을 !

(57)

 서로 밀접한 관련이 있는 것은 모은다 [1]

 문제에 필요한 정보들은?

년 월 일

이름

학번 성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

문 바퀴

기통수 배기량 사용연료

엔진 이차방정식 계수

(58)

 서로 밀접한 관련이 있는 것은 모은다 [2]

 그들 사이의 관련성은?

년 월 일

이름

성명 주소 전화번호

학번

성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

기통수 배기량 사용연료

...

엔진

(59)

 서로 밀접한 관련이 있는 것은 모은다 [3]

 모아서 하나의 객체로.

 그리고, 모인 것들은 그 객체의 속성으로.

년 월 일 일자

이름 성명

학번 성적 학생

이차방정식

바퀴 문 자동차

기통수 배기량 사용연료 a (2차항의 계수) 엔진

b (1차항의 계수) c (상수항의 계수)

이차방정식 계수

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

(60)

 요약

 문제를 풀기 위해서는,

 필요한 객체들은?

 객체의 사용법은?

 객체의 구현 방법은?

 우리는 앞으로 모든 문제를 이와 같은 관점에서

해결하려고 노력할 것이다!!!

(61)

[제 10 주 실습]

성적 처리

(62)

 성적처리: 단계별로 해결하자

 제1단계 [프로그램 10-1-1]

 점수를 학점으로 변환하기

 제2단계 [프로그램 10-1-2]

 학점을 평점으로 바꾸기

 제3단계 [프로그램 10-1-3]

 세 과목 점수 입력 처리하기

 제4단계 [프로그램 10-1-4]

 평균평점 구하기

(63)

[프로그램 10-1-1]

점수를 학점으로 변환하기

(64)

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

 입력

 0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력

100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸 다.

 입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.

 출력

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

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

오류: 100 이 넘어서, 정상적인 점수가 아닙니다.

(65)

 출력의 예

> 점수를 입력하시오: 82 점수: 82, 학점: B

> 점수를 입력하시오: 45 점수: 45, 학점: F

> 점수를 입력하시오: 93 점수: 93, 학점: A

> 점수를 입력하시오: 102

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

> 점수를 입력하시오: 66 점수: 66, 학점: D

> 점수를 입력하시오: 87 점수: 87, 학점: B

> 점수를 입력하시오: -1

음의 점수가 입력되어 입력을 종료합니다.

(66)

 점수 입력을 함수로 [1]

 점수 하나 입력 받는 것을 함수로 만들어 사용한 다.

 private static int inputScore()

함수에 주어지는 입력값은 없다.

출력값, 즉 리턴값은 키보드에서 입력 받은 한 개의 점수

점수가 올바르게 입력되었는지는 검사하지 않는다.

입력 전에 알림 메시지를 다음과 같이 내보낸다.

 사용법:

int currentScore;

currentScore = inputScore();

> 점수를 입력하시오:

(67)

 점수 입력을 함수로 [2]

 함수를 이용하지 않을 경우에는?

private Scanner scanner = new Scanner(System.in) ; public void main (String[] args) {

{

Student s = new Student() ; int currentScore ;

System.out.print(“>점수를 입력하시오: “ ) ; currentScore = scanner.nextInt() ;

while ( currentScore >= 0 ) { if ( currentScore >100 ) {

System.out.println(“오류: 100이 넘어서, 정상적인 점수가 아닙니다.”) }

else {

/* 점수가 정상이다 */

... // 필요한 일을 한다

(68)

 점수 입력을 함수로 [2]

 함수를 이용할 경우에는?

Student s = new Student() ; int currentScore ;

currentScore = inputScore() ;

while (currentScore >= 0) { if (currentScore >100) {

System.out.println(“오류: 100이 넘어서, 정상적인 점수가 아닙니다.”) }

else {

/* 점수가 정상이다 */

…… // 필요한 일을 한다

}

currentScore = inputScore() ;

}

private int inputScore()

{ System.out.print(“>점수를 입력하시오: “ ) ; return scanner.nextInt() ;

}

(69)

 Student 객체 사용자에게 필요한 공개함수는?

 public void setScore (int aScore) ; // 주어진 점수를 저장시킨다

 public int score () ;

// 현재 가지고 있는 점수를 얻는다

 public char grade() ;

// 현재 가지고 있는 점수에 해당하는 학점을 얻는다

(70)

 Class "Student "의 구조

public class Student {

private String _studentNo ; // 사용하지 않는다 private int _score ;

private char _grade ; // 사용하지 않는다 // 생성자

public Student () { this._score = 0 ;

} // 아래에는 공개함수를 정의 (구현)

}

(71)

 Class "Student "의 공개함수의 구현

public class Student {

private int _score ; public Student () // 생성자 { this._score = 0 ;

} // 공개함수의 구현

public void setScore (int aScore) // 주어진 점수를 저장한다 { this._score = aScore ;

}

public int score () // 현재 가지고 있는 점수를 사용자에게 돌려준다 { return this._score ;

}

(72)

 공개함수 "grade()" 의 구현

 점수를 학점으로 변환하는 기준

 90~100: A

 80~89: B

 70~79: C

 60~69: D

 0~59: F

(73)

 공개함수 "grade()" 의 구현

 구현 코드

public char grade() // 현재 가지고 있는 점수에 해당하는 학점을 돌려준다

{ if (this._score >= 90) {

return ‘A’ ; }

else if (this._score >= 80) { return ‘B’ ;

}

else if (this._score >= 70) { return ‘C’ ;

}

else if (this._score >= 60) { return ‘D’ ;

}

(74)

[프로그램 10-1-2]

학점을 평점으로 변환하기

(75)

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

 문제

 [프로그램 10-1-1]에서는 점수를 입력받아 학점으로 변 환했다.

 여기서는 학점을 평점으로 또 변환한다.

점수 ⇒ 학점 ⇒ 평점

 객체의 사용

 Student 객체

(76)

 입출력

 입력

 0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력

100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸 다.

 입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.

 출력

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

오류: 100 이 넘어서, 정상적인 점수가 아닙니다.

(77)

 출력의 예

> 점수를 입력하시오: 82 점수: 82, 학점: B, 평점: 3.0

> 점수를 입력하시오: 45 점수: 45, 학점: F , 평점: 0.0

> 점수를 입력하시오: 93 점수: 93, 학점: A , 평점: 4.0

> 점수를 입력하시오: 102

오류: 100이 넘어서, 정상적인 점수가 아닙니다.

> 점수를 입력하시오: 66 점수: 66, 학점: D , 평점: 1.0

> 점수를 입력하시오: 87 점수: 87, 학점: B , 평점: 3.0

> 점수를 입력하시오: -1

음의 점수가 입력되어 입력을 종료합니다.

(78)

 Student 객체 사용자에게 필요한 공개함수는?

 public void setScore (int aScore) ; // 주어진 점수를 저장시킨다

 public int score () ;

// 현재 가지고 있는 점수를 얻는다

 public char grade() ;

// 현재 가지고 있는 점수에 해당하는 학점을 얻는다

 public double gradePoint() ;

//현재 점수에 해당하는 평점을 얻는다

(79)

 학점을 평점으로 변환

 학점을 평점으로 변환하는 기준

 A: 4.0

 B: 3.0

 C: 2.0

 D: 1.0

 F: 0.0

(80)

 공개함수 "gradePoint()" 의 구현

 구현 코드

public double gradePoint()

// 현재 점수에 해당하는 평점을 돌려준다 { char currentGrade = this.grade() ;

switch ( currentGrade ) { case ‘A’ : return 4.0 ; case ‘B’ : return 3.0 ; case ‘C’ : return 2.0 ; case ‘D’ : return 1.0 ;

default : return 0.0 ; // case ‘F’

}

}

(81)

 평점 별 학생수 구하기

 필요한 객체는?

Student

main

GradeCounter

성적을 저장시킨다

학점을 요청하여 얻는다

학점을 보내어 세게 한다

(82)

 Class "GradeCounter"의 공개함수

 public GradeCounter() ; // 생성자

 public void count(char aGrade) ; // 주어진 학점을 세게 한다

 public int numberOfA() ; // A 학점의 학생 수를 얻는다

 public int numberOfB() ; // B 학점의 학생 수를 얻는다

 public int numberOfC() ; // C 학점의 학생 수를 얻는다

 public int numberOfD() ; // D 학점의 학생 수를 얻는다

 public int numberOfF() ; // F 학점의 학생 수를 얻는다

(83)

 main()에서의 gradeCounter 객체의 사용

private Scanner aScanner = new Scanner() ; public static void main (String[] args) {

{

Student aStudent = new Student() ;

GradeCounter gradeCounter = new GradeCounter() ; int currentScore ;

currentScore = inputScore() ; while (currentScore >= 0) {

if (currentScore >100) {

System.out.println(“오류: 100이 넘어서, 정상적인 점수가 아닙니다.“) } else {

// 점수가 정상이다

…… // 필요한 일을 한다

gradeCounter.count(aStudent.grade()) ; // gradeCounter 객체에 학점을 보내어 세게 한다.

}

(84)

 Class "GradeCounter"의 선언 [1]

public class GradeCounter {

private int _numberOfA ; private int _numberOfB ; private int _numberOfC ; private int _numberOfD ; private int _numberOfF ; public GradeCounter () // 생성자 { this._numberOfA = 0 ;

this._numberOfB = 0 ; this._numberOfC = 0 ; this._numberOfD = 0 ; this._numberOfF = 0 ; }

// 공개함수의 구현

public void count (char aGrade)

{ ... // 해당 학점의 수를 1 증가시킨다

} ... // 학점 A,B, C, D, F의 개수를 얻는 각각의 getter들 } // End of Class “GradeCounter”

(85)

 Class "GradeCounter"의 선언 [2]

public class GradeCounter {

... // 속성과 생성자의 선언 부분 // 공개함수의 구현

public void count (char aGrade) // 주어진 점수를 저장한다 { ... // 해당 학점의 수를 1 증가시킨다

}

public int numberOfA()

{ return this._numberOfA ; } public int numberOfB()

{ return this._numberOfB ;

(86)

[프로그램 10-1-3]

3 과목 처리하기

(87)

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

 문제

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

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

과목은 Korean, English, Computer

 객체의 사용

 Student 객체

(88)

 입출력

 입력

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

과목은 Korean, English, Computer

 입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.

 출력

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

 학점 별 인원수는 출력하지 않는다.

(89)

 출력의 예

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 82 - 점수를 입력하시오: 77 - 점수를 입력하시오: 90

[국 어] 점수: 82, 학점: B, 평점: 3.0 [영 어] 점수: 77, 학점: C, 평점: 2.0 [컴퓨터] 점수: 90, 학점: A, 평점: 4.0

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 45 - 점수를 입력하시오: 66 - 점수를 입력하시오: 88

[국 어] 점수: 45, 학점: F , 평점: 0.0 [영 어] 점수: 77, 학점: C, 평점: 2.0 [컴퓨터] 점수: 90, 학점: A, 평점: 4.0

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 93 - 점수를 입력하시오: 56 - 점수를 입력하시오: 72

[국 어] 점수: 93, 학점: A, 평점: 4.0 [영 어] 점수: 56, 학점: F, 평점: 0.0 [컴퓨터] 점수: 72, 학점: C, 평점: 2.0

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 102 - 점수를 입력하시오: 85

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오 : 87 - 점수를 입력하시오 : 95 - 점수를 입력하시오 : 99

[국 어] 점수: 87, 학점: B, 평점: 3.0 [영 어] 점수: 95, 학점: A, 평점: 4.0 [컴퓨터] 점수: 99, 학점: A, 평점: 4.0

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오 : -1 - 점수를 입력하시오 : -1 - 점수를 입력하시오 : -1

음의 점수가 입력되어 입력을 종료합니다.

프로그램을 종료합니다.

(90)

 Class "Student" 의 공개함수

pubic Student() ; // 생성자

public void setScoreKorean (int aScoreKorean) ; // 주어진 Korean 점수를 저장시킨다

public int scoreKorean () ; // Korean 점수를 얻는다

public char gradeKorean() ; // Korean 점수에 해당하는 학점을 얻는다

public void setScoreEnglish (int aScoreEnglish) ; // 주어진 English 점수를 저장시킨다

public int scoreEnglish () ; // English 점수를 얻는다

public char gradeEnglish() ; // English 점수에 해당하는 학점을 얻는다

public void setScoreComputer (int aScoreComputer) ; // 주어진 Computer 점수를 저 장시킨다

public int scoreComputer () ; // Computer 점수를 얻는다

public char gradeKorean() ; // Computer 점수에 해당하는 학점을 얻는다

(91)

 Class "Student"의 공개함수의 구현

public class Student {

private int _scoreKorean ; private int _scoreEnglish ; private int _scoreComputer ;

public Student () // 생성자

{ this._scoreKorean = 0 ; this._scoreEnglish = 0 ; this._scoreComputer= 0 ; }

// 공개함수의 구현

public void setScoreKorean (int aScoreKorean) { this._scoreKorean = aScoreKorean ;

} public int scoreKorean () { return this._scoreKorean ; } public char gradeKorean() {

(92)

 Class "Student"의 비공개함수

public class Student {

private int _scoreKorean ; private int _scoreEnglish ; private int _scoreComputer ; public Student () // 생성자

{ this._scoreKorean = 0 ; this._scoreEnglish = 0 ; this._scoreComputer= 0 ; }

// 공개함수의 구현

public void setScoreKorean (int aScoreKorean) { this._scoreKorean = aScoreKorean ;

} public int scoreKorean () { return this._scoreKorean ; } public char gradeKorean() {

return this.score2grade(this._scoreKorean) ; }

... // 다른 두 과목에 대해서도 마찬가지로 구현한다 } // End of Class “Student”

private char score2Grade(int aScore) { if (aScore >= 90) {

return ‘A’ ; } else if ...

}

(93)

 3 과목 점수 입력 받기

 inputScore()를 3 번 사용한다.

System.out.println(“\n> 세 과목 (국어, 영어 컴퓨터)의 점수를 차례로 입력합니다:”) ; aScoreKorean = inputScore() ;

s.setScoreKorean (aScoreKorean) ;

aScoreEnglish= inputScore() ;

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 82 - 점수를 입력하시오: 77 - 점수를 입력하시오: 90

(94)

 점수 오류 검사하기

 3 개의 점수 중에서 하나만 100 이 넘어도 오류 메시지를 내보내기로 한다.

if ( (aScoreKorean > 100) || (aScoreEnglish > 100) || (aScoreComputer > 100 ) ) { System.out.println (“오류: 100 이 넘어서, 정상적인 점수가 아닌 것이 있습니다.”) ; }

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:

- 점수를 입력하시오: 102 - 점수를 입력하시오: 85 - 점수를 입력하시오: 20

오류: 100이 넘어서, 정상적인 점수가 아닌 것이 있습니다.

(95)

[프로그램 10-1-4]

평균 평점 구하기

(96)

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

 문제

 [프로그램 10-1-3]과 입력은 동일하다.

세 과목 Korean, English, Computer 의 점수를 입력받는다.

 각 학생의 평균 평점을 계산하여 출력한다

(97)

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

 입력

 세 과목 의 점수를 입력 받는다.

Korean, English, Computer

 입력의 종료 조건

음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.

 출력

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

 또한 평균 평점을 출력한다.

(98)

 프로그램 10-1-4

 출력의 예

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 82 77 90 [국 어] 점수: 82, 학점: B, 평점: 3.0

[영 어] 점수: 77, 학점: C, 평점: 2.0 [컴퓨터] 점수: 90, 학점: A, 평점: 4.0 이 학생의 평균평점은 3.0 입니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 45 66 90 [국 어] 점수: 45, 학점: F , 평점: 0.0

[영 어] 점수: 77, 학점: C, 평점: 2.0 [컴퓨터] 점수: 90, 학점: A, 평점: 4.0 이 학생의 평균평점은 2.0 입니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 93 56 72 [국 어] 점수: 93, 학점: A, 평점: 4.0

[영 어] 점수: 56, 학점: F, 평점: 0.0 [컴퓨터] 점수: 72, 학점: C, 평점: 2.0 이 학생의 평균평점은 2.0 입니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 102 85 20 오류: 100이 넘어서, 정상적인 점수가 아닙니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 66 85 20 [국 어] 점수: 66, 학점: D, 평점: 1.0

[영 어] 점수: 85, 학점: B, 평점: 3.0 [컴퓨터] 점수: 20, 학점: F, 평점: 0.0 이 학생의 평균평점은 1.33 입니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: 87 95 99 [국 어] 점수: 87, 학점: B, 평점: 3.0

[영 어] 점수: 95, 학점: A, 평점: 4.0 [컴퓨터] 점수: 99, 학점: A, 평점: 4.0 이 학생의 평균평점은 3.67 입니다.

> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력하시오: -1 -1 -1 음의 점수가 입력되어 입력을 종료합니다.

평균평점이 3.0 이상인 학생은 2 명입니다.

평균평점이 2.0 이상 3.0 미만인 학생은 2 명입니다.

평균평점이 1.0 이상 2.0 미만인 학생은 1 명입니다.

(99)

 Student 에 필요한 추가 기능은?

 공개함수 gpa()

 public double gpa() ; // Student 객체로부터 평균 평점 을 얻는다.

 비공개 함수 grade2Point()

 private char score2Grade (int aScore) ; // 주어진 점수를 학점으로 변환한다.

 private double grade2Point(char aGrade) ;

// 주어진 학점을 평점으로 변환한다

(100)

 평균 평점 계산

 평점(GPA: Grade Point Average) 구하기

(gradePointKorean + gradePointEnglish + gradePointComputer) / 3.0 ;

 공개 함수로:

public double gpa ( ) {

double gradePointKorean, gradePointEnglish, gradePointComputer ; ... // 각 과목의 점수를 학점으로 변환한다.

... // 각 과목의 학점을 평점으로 변환한다.

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

return ... ; // 평균 평점을 돌려준다

}

(101)

 평균평점 별 학생 수 구하기

 Class GPACounter를 사용한다

 공개함수

public GPACounter() ; // 생성자

public void count (double aGPA) ; // 주어진 평균 평점에 대해 해당 점수 범위에 들어가는 학생 수를 1 증가시키게 한다

public int numberOfGPA3 () ; // 3.0 이상의 학생수를 얻는다

public int numberOfGPA2 () ; // 2.0 이상 3.0 미만의 학생수를 얻는다

public int numberOfGPA1 () ; // 1.0 이상 2.0 미만의 학생수를 얻는다

public int numberOfGPA0 () ; // 0.0 이상 1.0 미만의 학생수를 얻는다

(102)

 Class GPACounter

public class GPACounter {

private int _numberOfGPA3 ; private int _numberOfGPA2 ; private int _numberOfGPA1 ; private int _numberOfGPA0 ; public GPACounter () // 생성자 { this._numberOfGPA3 = 0 ; this._numberOfGPA2 = 0 ; this._numberOfGPA1 = 0 ; this._numberOfGPA0= 0 ; }

// 공개함수의 구현

public void count (double aGPA)

{ ... // 해당 GPA 구간 학생 수를 1 증가시킨다

} ... // GPA3, GPA2, GPA1, GPA0 의 개수를 얻는 각각의 getter들 } // End of Class “GPACounter”

(103)

 평균평점 별 학생 수 구하기

 public void count (double aGPA) if (aGPA >= 3.0) {

this._numberOfGPA3 ++ ; }

else if (aGPA >= 2.0) {

this._numberOfGPA2 ++ ; }

else if

... // 마저 채우시오

(104)

[제 10 주] 끝

참조

관련 문서

질의와 객체의 색인(특징)이 유사하면 유사한 객체.. 특징 feature: 작고, 매체 식별하고,

치위생 치료 과정에서 약리학의 역할을 설명할 수 있어야 한다.. 의약물 조제의 다양한 유형에 대해 확인할

개개인의 레크리에이션 욕구를 충족시켜줄 수

 시스템내의 객체, 객체사이의 관계, 그리고 객체의 각 클래스의 특 징을 나타내는 속성이나 조작을 표시함에 의하여 시스템의 정적구조 를

더 이상 점수는 입력되지 않는다..  마지막에

 ms가 소유하고 있는 객체의 마방짂 차수가 유효하면 TRUE, 아니면 FALSE를 얻는다..

 평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다..  학생들의

{ QuadEqProblem qeProblem ; // 객체 생성: 문제 풀이 과정에서 필요한 모든 정보를 소유 BOOLEAN solvingRequested ;.. QuadEquation