제 10 주:
객체의 표현 1
객체의 표현
- 객체 인식하기 -
객체 (Objects)
컴퓨터로 문제를 풀려면?
문제에 등장하는 여러 대상들이 있다.
이차 방정식에서는 3 개의 계수들이.
Factorial 계산에서는 입력 정수 값 n 이.
바로 이러한 대상들을 객체(Object)라고 한다.
성 이름
성명
2차항계수 1차항계수 상수항계수
이차방정식
입력값factorial
객체 (Objects)
간단한 객체 유형들과 그 속성
년 월 일
일자
성이름
성명
성명 주소 전화번호
개인
학번 성적
학생
객체 (Objects)
문제가 복잡해지면,
보다 많은 객체들이 존재하게 되며,
객체 하나 하나가 많은 속성(attribute)을 갖게 된다.
문 바퀴 엔진 변속기 트렁크
자동차
기통수 배기량 사용연료
...
엔진
객체 (Objects)
객체의 속성도 또한 객체일수도...
작은 객체가 모여서 더 큰 객체로.
문 바퀴
변속기 트렁크
...
자동차
기통수 배기량 사용연료
...
엔진
객체 (Objects)
그러므로, 문제를 풀기 위해서는,
우리가 파악해야 할 객체가 무엇인지?
파악된 객체는 컴퓨터 안에 어떻게 효과적으로 표현 (저 장) 해야 하는지?
또한, 그 객체를 가지고 어떤 일(계산)을 해야 하는지?
객체 (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) ;
객체(object)와 속성(attribute)
이차방정식 문제:
3 개의 계수는 3 개의 객체?
앞의 실습에서는 3 개의 독립된 객체로 취급되었다.
하나의 객체?
“이차식” 이라는 객체(object)가 있고,
3 개의 계수는 이 객체의 “2차항 계수”, “1차항 계수”,
“상수 항 계수”라는 속성(attribute).
이차식: (2차항 계수, 1차항 계수, 상수항 계수)
객체와 객체와 직결된 기능
모든 객체는,
어떤 대상을 표현한다.
그 표현된 대상과 직결된 할 일이 존재하게 된다.
예: 이차방정식의 해 구하기
2차항의 계수가 0 인지를 판단한다.
판별식의 값이 0 보다 작은지를 판단한다.
이차방정식의 실근을 근의 공식을 사용하여 계산한다.
그러므로, 직결된 할 일이 무엇인지를 파악하는 것 이 또한 중요하다.
객체의 사용하는 사람 (사용자)의 관점은?
객체를 만드는 사람 (구현자)의 관점은?
객체 사용자는 어떻게 ?
객체의 내부 구조나 속성을 알고 싶을까?
TV는 그 내부가 매우 복잡한 객체
TV 사용자는 TV 객체 내부의 복잡한 전자적/기계적 구
조나 속성을 알고 싶을까?
객체 사용자는 어떻게 ?
사용자는 단지 TV 객체를 쉽게 사용하기를 원할 뿐!
전원 스위치로 켜고 끈다
볼륨 스위치로 소리 크기를 조절한다
채널 스위치로 원하는 채널을 선택한다
객체 사용자는 어떻게 ?
리모콘의 역할은?
사용자에게 TV 객체의 내부를 알 필요 없이 편리하게 TV 시청을 하게 해 준다.
리모콘의 각각의 단추가 TV 를 쉽고 편리하게 사용하
도록 만들어 준다.
객체 구현자는 어떻게 ?
구현자는 TV 객체를 사용하기 쉽고 편하고, 성능 좋고, 싸게 만들어야 한다!
TV 제조회사(구현자)는 사용자의 요구 사항에 맞도록 그 내부의 전자적/기계적 구조를 설계하고 만들어야 한다.
사용법이 바뀌지 않으면서, 지속적으로 성능을 혁신시킨
다.
요약
문제를 풀기 위해서는,
필요한 객체들은?
사용자의 관점에서:
객체의 쉽고 편한 사용법은?
구현자의 관점에서:
객체의 속성은?
좋은 성능을 내기 위한 객체의 내부 구조는?
사용자가 쉽고 편하게 사용하도록 하기 위해, 객체가 해야 할 일
은?
Java 에서의 객체
문제
학생들의 학번과 성적을 키보드로부터 읽어 들인 다.
학번은 크기 10 인 문자열이다.
학번을 구성하는 문자의 개수가 9개이다.
성적은 100점 만점의 정수형 점수이다.
0점부터 100점까지 사이의 정수이다.
학생의 성적이 60점 이상이면 “통과”, 60점 미만이 면 “실패”로 판정한다.
학생 개인마다 학번과 성적과 판정을 출력한다.
객체 사용자의 관점은?
필요한 객체는?
학생
Student:
학생 객체의 사용법은?
Student:
학번을 부여한다 학번을 얻어낸다 성적을 부여한다 성적을 얻어낸다
합불 판정을 얻어낸다
Student:
객체는 언제나 리모콘으로만!
Student가 TV라면, 리모콘은?
학번을 부여한다
학번을 얻어낸다
성적을 부여한다
성적을 얻어낸다
객체 사용법은 공개함수로!
공개함수 (public functions / public methods)
리모콘 단추 하나가 한 개의 공개함수
Student:
setStudentNo(String aStudentNo) String studentNo()
void setScore(int aScore) int score()
char grade()
객체는 Java에서 어떻게 나타낼 수 있을까?
일반 변수를 다시 생각해보자.
double d ;
변수 d 역시 하나의 객체로 생각할 수 있다.
그 자료형이 double 이다.
직결된 연산:
+, -, *, / 과 같은 사칙연산
>, <, ==, != 과 같은 비교연산
이런 연산이 항상 모두 필요한 것은 아니다.
이러한 연산이 결합된 복잡한 계산일 수도 있다.
판별식의 계산
일반적인 객체의 표현은?
kim이라는 학생을 위한 학생정보는?
우리는 이렇게 하고 표현하고 싶다.
Student kim ;
(cf.) double d ;
kim은 하나의 객체 변수이다.
모든 객체는 Java 에서 변수로 표현하게 된다.
그 자료형이 Student 이다.
_studentNo: “20119999”
_score: 87 _grade: ‘P’
Student: kim
Class: 객체의 자료형
그렇다면, 자료형 Student는 Java에서 어떻게 표 현?
다양한 객체의 형태가 미리 정의되어 존재할 수는 없다.
int, double, char와 같이 가장 기본적인 것만 미리 존재한다.
우리가 자료형을 만들어 (정의하여) 사용한다.
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
...
객체는 Class 로
class는 하나의 자료형 (추상자료형)
class 에는 “객체의 속성” 이 포함되게 된다.
나중에 좀 더 자세히...
public class Student {
private String _studentNo ; private int _score ;
private char _grade ; ...
}
객체의 자료형은 class 이름으로
Class 에 이름을 부여하자.
Student 객체들을 위한 Student class
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
...
Class 의 선언
그러므로, 다음과 같이 선언된다.
public class Student {
private String _studentNo ; private int _score ;
private char _grade ; ...
}
객체의 속성은 private으로
왜 속성은 private으로 선언할까?
사용자는 객체에게 일을 어떻게 시키면 좋을까?
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
...
완성된 class 인가?
아직은...
객체는 해야 할 일이 있다.
TV 리모콘의 각각의 단추가 눌러졌을 때 해야 할 일
그 일도 함께 class 안에 정의해야 한다.
어떻게?
public class Student {
private String _studentNo ; private int _score ;
private char _grade ; ... // 이곳에는?
}
객체 변수 (Object Variable)
이제 우리는 일단은, 객체 변수를 만들어 사용할 수 있다.
일반 변수의 선언 방법과 마찬가지로.
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
// ... // 일단은 주석으로}
객체 변수가 바로 객체?
객체 변수 kim의 선언으로 그림처럼 될까?
마치 일반 변수처럼...
즉, 객체 변수의 선언으로
객체가 바로 존재하게 될까?
_studentNo:_score:
_grade:
Student: kim
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
// ...}
Student kim ;
변수 선언으로 객체는 만들어지지 않는다!
객체 변수 kim의 선언의 결과는...
public class Student {
private String _studentNo ; private int _score ;
private char _grade ;
// ...}
Student kim ;
_studentNo:
_score:
_grade:
실제 객체
kim
객체를 생성시켜 보자 [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
객체를 생성시켜 보자 [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
객체를 생성시켜 보자 [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: ‘ ’
실제 객체
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 이름과 동일
생성자는 사용자가 사용!
public class Student {
private String _studentNo ; private int _score ;
private char _grade ; // 생성자
public Student () {
this._studentNo = null ; this._score = 0 ;
this._grade = ‘ ‘ ; }
// ...
}
객체의 생성자는 반드시 public
반드시 public:
객체를 외부에서 사용(생성) 해야 하므로
객체를 생성하고 그 소유권을 돌려준다.
소유권: (또는 사용권)
실제로는 메모리에 생성된 객체의 주소값
public class Student {private String _studentNo ; private int _score ;
private char _grade ; // 생성자
public Student () {
this._studentNo = null ; this._score = 0 ;
this._grade = ‘ ‘ ;
객체의 생성자는 무엇을 돌려주는가?
돌려주는 값은 있 지만, 그 type은 명 시하지 않는다
객체의 사용자는 어떻게 객체를 사용?
객체의 사용자는 객체의 private 속성을 알지 못한 다.
kim ._score = 87 ; kim
?
_studentNo _score _grade
_score 는 private
컴파일 오류 사용자는 객체의 내부 속성
에 직접 접근 불가
객체에게 일을 시킨다
리모콘 단추 setScore()를 누른다.
즉 객체의 사용자는 객체에 대해 직접 일을 하지 않고, 반드시 객체에게 시킨다.
TV 리모콘을 생각해 보라
kim
kim . setScore (87) ;
객체에게 일을 시킨다
사용자는 공개함수를 사용하여 객체에게 일을 시 킨다.
kim
87
_studentNo _score _grade
kim . setScore (87) ;
Student 객체가 할 수 있는 일 일을 시킬 Student 객체를 소유한 객체변수
객체변수와 시킬 일 사이를
구분하는 점(dot)
객체의 구현자의 관점은?
객체의 내부 구조는?
학번 (_studentNo): 9개 문자를 저장할 수 있는 문 자열
성적 (_score): 정수형
학점 (_grade): 문자
성적이 60점 이상이면 학점은 ‘P’의 값을, 60점 미만이면 ‘F’의 값을 갖는다.
_studentNo:
_score:
_grade:
Student:
객체가 해야 할 일은?
학번의 set / get
성적의 set / get
성적 합불 평가
성적을 판단하여, 통과/실패의 결과를 얻는다.
합불 평가의 get
if (kim의 _score >= 60) kim의 _grade = ‘P’;
else
_studentNo: “20119999”_score: 87
Student: kim
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
Class 안에서의 사용법의 정의
public class Student {
private String _studentNo ; private int _score ;
private char _grade ; // 생성자
public Student() { ...
}
public void setScore (int aScore) { ... // 여기에 실제 할 일을 }
사용자의
사용법이므로
반드시 public
객체가 할 일의 구현
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 ; }
}각 사용법에 대해,
객체가 실제로 할
일
Class 안에서 속성의 사용법
자신에게 일을 시킨 사용자가 지정한 객체를, 공개 함수가 인지하는 방법은?
public void setScore (int aScore ) { this ._score = aScore ;
}
kim
Class 안에서 속성의 사용법
“this”
public void setScore (int aScore ) { this ._score = aScore ;
} kim
87
_studentNo _score _grade
일을 하도록 지시 받은 객체 자신을 가리킨다
“this” 표현은 객체 외부에서는 사용 불가
kim . setScore ( 87 ) ;
Class 안에서 속성의 사용법
this._score
public void setScore (int aScore ) { this. _score = aScore ;
}
kim 일을 하도록 명령을 받은 객체가
가지고 있는 속성의 이름
객체의 인식, 그리고 표현
큰 것으로부터 작은 것을 !
필요한 객체를 인식한다 [1]
문제 해결에 필요한 객체가 무엇인지?
성명 일자
개인 학생
이차방정식 자동차
필요한 객체를 인식한다 [2]
문제 해결에 필요한 객체가 무엇인지?
그 다음, 각 객체에 요구되는 속성은 무엇인지?
년 월 일 일자 성
이름 성명
학번 성적 학생
이차방정식
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해 문
바퀴 자동차
기통수 배기량 사용연료
엔진
관점을 바꾸어 보자!
작은 것으로부터 큰 것을 !
서로 밀접한 관련이 있는 것은 모은다 [1]
문제에 필요한 정보들은?
년 월 일 성
이름
학번 성적
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해
문 바퀴
기통수 배기량 사용연료
엔진 이차방정식 계수
서로 밀접한 관련이 있는 것은 모은다 [2]
그들 사이의 관련성은?
년 월 일 성
이름
성명 주소 전화번호
학번
성적
a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)
이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해 문
바퀴
변속기 트렁크 ...
기통수 배기량 사용연료
...
엔진
서로 밀접한 관련이 있는 것은 모은다 [3]
모아서 하나의 객체로.
그리고, 모인 것들은 그 객체의 속성으로.
년 월 일 일자 성
이름 성명
학번 성적 학생
이차방정식
바퀴 문 자동차
기통수 배기량 사용연료 a (2차항의 계수) 엔진
b (1차항의 계수) c (상수항의 계수)
이차방정식 계수
x1 (방정식의 해 1) x2 (방정식의 해 2)
방정식의 해
요약
문제를 풀기 위해서는,
필요한 객체들은?
객체의 사용법은?
객체의 구현 방법은?
우리는 앞으로 모든 문제를 이와 같은 관점에서
해결하려고 노력할 것이다!!!
[제 10 주 실습]
성적 처리
성적처리: 단계별로 해결하자
제1단계 [프로그램 10-1-1]
점수를 학점으로 변환하기
제2단계 [프로그램 10-1-2]
학점을 평점으로 바꾸기
제3단계 [프로그램 10-1-3]
세 과목 점수 입력 처리하기
제4단계 [프로그램 10-1-4]
평균평점 구하기
[프로그램 10-1-1]
점수를 학점으로 변환하기
제 1 단계 [프로그램 10-1-1]
입력
0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력
100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸 다.
입력의 종료 조건
음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.
출력
입력된 점수와 그에 해당하는 학점을 출력한다.
마지막에 학점별 학생수를 출력한다.
오류: 100 이 넘어서, 정상적인 점수가 아닙니다.
출력의 예
> 점수를 입력하시오: 82 점수: 82, 학점: B
> 점수를 입력하시오: 45 점수: 45, 학점: F
> 점수를 입력하시오: 93 점수: 93, 학점: A
> 점수를 입력하시오: 102
오류: 100이 넘어서, 정상적인 점수가 아닙니다.
> 점수를 입력하시오: 66 점수: 66, 학점: D
> 점수를 입력하시오: 87 점수: 87, 학점: B
> 점수를 입력하시오: -1
음의 점수가 입력되어 입력을 종료합니다.
점수 입력을 함수로 [1]
점수 하나 입력 받는 것을 함수로 만들어 사용한 다.
private static int inputScore()
함수에 주어지는 입력값은 없다.
출력값, 즉 리턴값은 키보드에서 입력 받은 한 개의 점수
점수가 올바르게 입력되었는지는 검사하지 않는다.
입력 전에 알림 메시지를 다음과 같이 내보낸다.
사용법:
int currentScore;
currentScore = inputScore();
> 점수를 입력하시오:
점수 입력을 함수로 [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 {
/* 점수가 정상이다 */
... // 필요한 일을 한다
점수 입력을 함수로 [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() ;
}
Student 객체 사용자에게 필요한 공개함수는?
public void setScore (int aScore) ; // 주어진 점수를 저장시킨다
public int score () ;
// 현재 가지고 있는 점수를 얻는다
public char grade() ;
// 현재 가지고 있는 점수에 해당하는 학점을 얻는다
Class "Student "의 구조
public class Student {
private String _studentNo ; // 사용하지 않는다 private int _score ;
private char _grade ; // 사용하지 않는다 // 생성자
public Student () { this._score = 0 ;
} // 아래에는 공개함수를 정의 (구현)
}
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 ;
}
공개함수 "grade()" 의 구현
점수를 학점으로 변환하는 기준
90~100: A
80~89: B
70~79: C
60~69: D
0~59: F
공개함수 "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’ ;
}
[프로그램 10-1-2]
학점을 평점으로 변환하기
제 2 단계 [프로그램 10-1-2]
문제
[프로그램 10-1-1]에서는 점수를 입력받아 학점으로 변 환했다.
여기서는 학점을 평점으로 또 변환한다.
점수 ⇒ 학점 ⇒ 평점
객체의 사용
Student 객체
입출력
입력
0부터 100 사이의 정수로 된 점수가 학생 수 만큼 입력
100보다 큰 점수가 입력되면 다음과 같은 오류 메시지를 내보낸 다.
입력의 종료 조건
음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.
출력
입력된 점수와 그에 해당하는 학점과 평점을 출력한다.
오류: 100 이 넘어서, 정상적인 점수가 아닙니다.
출력의 예
> 점수를 입력하시오: 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
음의 점수가 입력되어 입력을 종료합니다.
Student 객체 사용자에게 필요한 공개함수는?
public void setScore (int aScore) ; // 주어진 점수를 저장시킨다
public int score () ;
// 현재 가지고 있는 점수를 얻는다
public char grade() ;
// 현재 가지고 있는 점수에 해당하는 학점을 얻는다
public double gradePoint() ;
//현재 점수에 해당하는 평점을 얻는다
학점을 평점으로 변환
학점을 평점으로 변환하는 기준
A: 4.0
B: 3.0
C: 2.0
D: 1.0
F: 0.0
공개함수 "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’
}
}
평점 별 학생수 구하기
필요한 객체는?
Student
main
GradeCounter
성적을 저장시킨다
학점을 요청하여 얻는다
학점을 보내어 세게 한다
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 학점의 학생 수를 얻는다
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 객체에 학점을 보내어 세게 한다.
}
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”
Class "GradeCounter"의 선언 [2]
public class GradeCounter {
... // 속성과 생성자의 선언 부분 // 공개함수의 구현
public void count (char aGrade) // 주어진 점수를 저장한다 { ... // 해당 학점의 수를 1 증가시킨다
}
public int numberOfA()
{ return this._numberOfA ; } public int numberOfB()
{ return this._numberOfB ;
[프로그램 10-1-3]
3 과목 처리하기
제 3 단계 [프로그램 10-1-3]
문제
[프로그램 10-1-2]에서는 한번에 하나의 점수만 입력받 았다.
여기서는 한번에 3 과목의 점수를 입력 받는다.
과목은 Korean, English, Computer
객체의 사용
Student 객체
입출력
입력
한번에 3 과목의 점수를 입력 받는다.
과목은 Korean, English, Computer
입력의 종료 조건
음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.
출력
입력된 점수와 그에 해당하는 학점과 평점을 출력한다.
학점 별 인원수는 출력하지 않는다.
출력의 예
> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:
- 점수를 입력하시오: 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
음의 점수가 입력되어 입력을 종료합니다.
프로그램을 종료합니다.
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 점수에 해당하는 학점을 얻는다 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() {
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 ...
}
3 과목 점수 입력 받기
inputScore()를 3 번 사용한다.
System.out.println(“\n> 세 과목 (국어, 영어 컴퓨터)의 점수를 차례로 입력합니다:”) ; aScoreKorean = inputScore() ;
s.setScoreKorean (aScoreKorean) ;
aScoreEnglish= inputScore() ;
> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:
- 점수를 입력하시오: 82 - 점수를 입력하시오: 77 - 점수를 입력하시오: 90
점수 오류 검사하기
3 개의 점수 중에서 하나만 100 이 넘어도 오류 메시지를 내보내기로 한다.
if ( (aScoreKorean > 100) || (aScoreEnglish > 100) || (aScoreComputer > 100 ) ) { System.out.println (“오류: 100 이 넘어서, 정상적인 점수가 아닌 것이 있습니다.”) ; }
> 세 과목 (국어, 영어, 컴퓨터) 의 점수를 차례로 입력합니다:
- 점수를 입력하시오: 102 - 점수를 입력하시오: 85 - 점수를 입력하시오: 20
오류: 100이 넘어서, 정상적인 점수가 아닌 것이 있습니다.
[프로그램 10-1-4]
평균 평점 구하기
제 4 단계 [프로그램 10-1-4]
문제
[프로그램 10-1-3]과 입력은 동일하다.
세 과목 Korean, English, Computer 의 점수를 입력받는다.
각 학생의 평균 평점을 계산하여 출력한다
제 4 단계 [프로그램 10-1-4]
입력
세 과목 의 점수를 입력 받는다.
Korean, English, Computer
입력의 종료 조건
음수의 점수가 입력되면 입력은 종료되는 것으로 본다. 더 이상 점수는 입력되지 않는다.
출력
입력된 점수와 그에 해당하는 학점과 평점을 출력한다.
또한 평균 평점을 출력한다.
프로그램 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 명입니다.
Student 에 필요한 추가 기능은?
공개함수 gpa()
public double gpa() ; // Student 객체로부터 평균 평점 을 얻는다.
비공개 함수 grade2Point()
private char score2Grade (int aScore) ; // 주어진 점수를 학점으로 변환한다.
private double grade2Point(char aGrade) ;
// 주어진 학점을 평점으로 변환한다
평균 평점 계산
평점(GPA: Grade Point Average) 구하기
(gradePointKorean + gradePointEnglish + gradePointComputer) / 3.0 ; 공개 함수로:
public double gpa ( ) {
double gradePointKorean, gradePointEnglish, gradePointComputer ; ... // 각 과목의 점수를 학점으로 변환한다.
... // 각 과목의 학점을 평점으로 변환한다.
... // 세 과목의 평균 평점을 계산한다.
return ... ; // 평균 평점을 돌려준다
}
평균평점 별 학생 수 구하기
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 미만의 학생수를 얻는다 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”