ExecClass : 메인 클래스
People : Student, Teacher, Cashier의 Super 클래스
Student : 객체 데이터로써 자신의 개인 성적을 확인함.
Teacher : 객체 데이터로써 자신의 학생 명단과 과목별 성적, 총점, 평균, 등수까지 확인함.
Cashier : 객체 데이터로써 매점 전체 매출과 각 학생별 지출을 계산함. (학생의 지출은 랜덤 생성)
1. 메인 클래스
import java.util.Random;
public class ExecClass {
public static void main(String[] args) {
// Step 1.1. 학생 데이터 생성.
// Student 클래스의 변수에 직접 접근하기 위해서 배열을 Super 클래스인 People 말고 Student 클래스로 직접 만든다.
Student[] stu = new Student[10];
stu[0] = new Student("공유", 42, 100, 95, 100);
stu[1] = new Student("둘리", 23, 91, 15, 62);
stu[2] = new Student("쵸파", 15, 47, 20, 90);
stu[3] = new Student("또치", 67, 50, 32, 47);
stu[4] = new Student("펭수", 32, 74, 52, 89);
stu[5] = new Student("빼꼼", 32, 90, 100, 20);
stu[6] = new Student("타요", 15, 90, 74, 38);
stu[7] = new Student("루키", 20, 25, 100, 21);
stu[8] = new Student("토니", 53, 12, 56, 100);
stu[9] = new Student("포코", 61, 69, 74, 17);
// Step 1.2. Student 클래스한테 학생 자신의 성적을 스스로 계산하도록 함.
int stuLen = stu.length;
for(int i = 0; i < stuLen; i++) {
stu[i].reportCard(); // 방법 1.
// stu[i].toString(); // 방법 2.
}
System.out.println("----------");
// Step 2.1. 선생 데이터 생성.
Teacher tea = new Teacher("호랑이", 999, "특별반", stu);
// Step 2.2. Teacher 클래스한테 선생 정보와 학생 명단, 성적, 등수를 계산하여 출력하도록 함.
tea.StudentInfo();
System.out.println("----------");
// Step 3.1. 매점 직원 데이터 생성.
Cashier cashier = new Cashier("강호동", 49, stu);
// 학생들의 매점 이용을 랜덤하게 생성.
Random r = new Random();
int salesCount = 0;
while (salesCount < 100) { // 총 100번의 매출을 학생과 금액을 랜덤하게 생성함.
cashier.sale(r.nextInt(10), r.nextInt(5001) + 1000); // 0~9번 학생이 랜덤하게 1000~6000원을 사용.
salesCount++;
}
// Step 3.2. Cashier 클래스한테 매점 직원의 정보와 전체, 학생별 매출 정보를 출력하게 함.
System.out.println(cashier);
}
}
2. Super 클래스
public class People {
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return this.name + " (" + this.age + ")";
}
}
3. Sub 클래스들
public class Student extends People {
int korScore;
int engScore;
int mathScore;
int totalScore;
double avgScore;
// Step 1.1.
public Student(String name, int age, int korScore, int engScore, int mathScore) {
super(name, age);
// TODO Auto-generated constructor stub
this.korScore = korScore;
this.engScore = engScore;
this.mathScore = mathScore;
}
// Step 1.2.
// public void reportCard() {
// this.totalScore = this.korScore + this.engScore + this.mathScore;
// this.avgScore = Math.round(( (double)this.totalScore / 3) * 100) / 100.0; // 소수 둘째짜리까지 구하기 위해 Math.round(원래수*100)/100.0 을 했다. 100으로 나누면 안 됨. 소수 셋째자리까지 구하려면 Math.round(원래수*1000)/1000.0
// System.out.println(super.toString() + " 학생의 점수는");
// System.out.println("국어 : " + this.korScore + " 영어 : " + this.engScore + " 수학 : " + this.mathScore);
// System.out.println("총점 : " + this.totalScore + " 평균 : " + this.avgScore);
// }
// Step 1.2. 위에꺼를 계산과 출력을 각각의 메소드로 분리시켰음.
public void calc() {
this.totalScore = this.korScore + this.engScore + this.mathScore;
this.avgScore = Math.round(( (double)this.totalScore / 3) * 100) / 100.0; // 소수 둘째짜리까지 구하기 위해 Math.round(원래수*100)/100.0 을 했다. 100으로 나누면 안 됨. 소수 셋째자리까지 구하려면 Math.round(원래수*1000)/1000.0
}
// 방법 1.
public void reportCard() {
this.calc();
System.out.println(super.toString() + " 학생의 점수는");
System.out.println("국어 : " + this.korScore + " 영어 : " + this.engScore + " 수학 : " + this.mathScore);
System.out.println("총점 : " + this.totalScore + " 평균 : " + this.avgScore);
}
// 방법 2.
// public String toString() {
// super.toString();
// this.calc();
// System.out.println(super.toString() + " 학생의 점수는");
// System.out.println("국어 : " + this.korScore + " 영어 : " + this.engScore + " 수학 : " + this.mathScore);
// System.out.println("총점 : " + this.totalScore + " 평균 : " + this.avgScore);
// return "";
// }
}
결과(방법 1) :
공유 (42) 학생의 점수는
국어 : 100 영어 : 95 수학 : 100
총점 : 295 평균 : 98.33
둘리 (23) 학생의 점수는
국어 : 91 영어 : 15 수학 : 62
총점 : 168 평균 : 56.0
쵸파 (15) 학생의 점수는
국어 : 47 영어 : 20 수학 : 90
총점 : 157 평균 : 52.33
또치 (67) 학생의 점수는
국어 : 50 영어 : 32 수학 : 47
총점 : 129 평균 : 43.0
펭수 (32) 학생의 점수는
국어 : 74 영어 : 52 수학 : 89
총점 : 215 평균 : 71.67
빼꼼 (32) 학생의 점수는
국어 : 90 영어 : 100 수학 : 20
총점 : 210 평균 : 70.0
타요 (15) 학생의 점수는
국어 : 90 영어 : 74 수학 : 38
총점 : 202 평균 : 67.33
루키 (20) 학생의 점수는
국어 : 25 영어 : 100 수학 : 21
총점 : 146 평균 : 48.67
토니 (53) 학생의 점수는
국어 : 12 영어 : 56 수학 : 100
총점 : 168 평균 : 56.0
포코 (61) 학생의 점수는
국어 : 69 영어 : 74 수학 : 17
총점 : 160 평균 : 53.33
결과(방법 2) :
공유 (42) 학생의 점수는
국어 : 100 영어 : 95 수학 : 100
총점 : 295 평균 : 98.33
둘리 (23) 학생의 점수는
국어 : 91 영어 : 15 수학 : 62
총점 : 168 평균 : 56.0
쵸파 (15) 학생의 점수는
국어 : 47 영어 : 20 수학 : 90
총점 : 157 평균 : 52.33
또치 (67) 학생의 점수는
국어 : 50 영어 : 32 수학 : 47
총점 : 129 평균 : 43.0
펭수 (32) 학생의 점수는
국어 : 74 영어 : 52 수학 : 89
총점 : 215 평균 : 71.67
빼꼼 (32) 학생의 점수는
국어 : 90 영어 : 100 수학 : 20
총점 : 210 평균 : 70.0
타요 (15) 학생의 점수는
국어 : 90 영어 : 74 수학 : 38
총점 : 202 평균 : 67.33
루키 (20) 학생의 점수는
국어 : 25 영어 : 100 수학 : 21
총점 : 146 평균 : 48.67
토니 (53) 학생의 점수는
국어 : 12 영어 : 56 수학 : 100
총점 : 168 평균 : 56.0
포코 (61) 학생의 점수는
국어 : 69 영어 : 74 수학 : 17
총점 : 160 평균 : 53.33
public class Teacher extends People {
String className;
Student[] stuNum; // Student[0] ~ Student[9] 클래스를 배열로 모두 불러와야 학생 데이터를 사용할 수 있다.
int stuRank;
// Step 2.1.
public Teacher(String name, int age, String className, Student[] stuNum) {
super(name, age);
// TODO Auto-generated constructor stub
this.className = className;
this.stuNum = stuNum;
}
// Step 2.2. 등수를 구하는 로직.
public void ranking (int thisstudentTotalScore, int stuLen) {
for(int i = 0; i < stuLen; i++) {
if(thisstudentTotalScore < stuNum[i].totalScore) {
stuRank++;
}
}
}
// Step 2.2. 메인 로직.
public void StudentInfo() {
int stuLen = stuNum.length;
// 방법 1. // 예쁘게 보려면 학생 클래스 역시 방법 1 로 되어있어야 함.
for (int i = 0; i < stuLen; i++) {
stuRank = 1;
if (i == 0) {
System.out.println(super.toString() + " 선생님반\n 학생명단 | 국어 | 영어 | 수학 | 총점 | 평균 | 등수");
} else {
}
this.ranking(stuNum[i].totalScore, stuLen);
System.out.println(stuNum[i] + " " + String.format("%3d", stuNum[i].korScore)
+ " " + String.format("%3d", stuNum[i].engScore)
+ " " + String.format("%3d", stuNum[i].mathScore)
+ " " + String.format("%3d", stuNum[i].totalScore)
+ " " + String.format("%.2f", stuNum[i].avgScore)
+ " " + String.format("%2d", this.stuRank)); // 꼭 칸을 띄워주고 싶지 않더라도 변수와 변수 사이에는 ""를 넣어줘야한다. 안 그러면 변수끼리 합연산을 해버린다!!
}
// 방법 2.
// for (int i = 0; i < stuLen; i++) {
// stuRank = 1;
// if (i == 0) {
// System.out.println(super.toString() + " 선생님반\n");
// } else {
//
// }
// this.ranking(stuNum[i].totalScore, stuLen);
// System.out.println(stuNum[i] + "등수 : " + String.format("%2d", this.stuRank)); // 꼭 칸을 띄워주고 싶지 않더라도 변수와 변수 사이에는 ""를 넣어줘야한다. 안 그러면 변수끼리 합연산을 해버린다!!
//
// }
}
}
결과(방법 1) :
호랑이 (999) 선생님반
학생명단 | 국어 | 영어 | 수학 | 총점 | 평균 | 등수
공유 (42) 100 95 100 295 98.33 1
둘리 (23) 91 15 62 168 56.00 5
쵸파 (15) 47 20 90 157 52.33 8
또치 (67) 50 32 47 129 43.00 10
펭수 (32) 74 52 89 215 71.67 2
빼꼼 (32) 90 100 20 210 70.00 3
타요 (15) 90 74 38 202 67.33 4
루키 (20) 25 100 21 146 48.67 9
토니 (53) 12 56 100 168 56.00 5
포코 (61) 69 74 17 160 53.33 7
결과(방법 2) :
호랑이 (999) 선생님반
공유 (42) 학생의 점수는
국어 : 100 영어 : 95 수학 : 100
총점 : 295 평균 : 98.33
등수 : 1
둘리 (23) 학생의 점수는
국어 : 91 영어 : 15 수학 : 62
총점 : 168 평균 : 56.0
등수 : 5
쵸파 (15) 학생의 점수는
국어 : 47 영어 : 20 수학 : 90
총점 : 157 평균 : 52.33
등수 : 8
또치 (67) 학생의 점수는
국어 : 50 영어 : 32 수학 : 47
총점 : 129 평균 : 43.0
등수 : 10
펭수 (32) 학생의 점수는
국어 : 74 영어 : 52 수학 : 89
총점 : 215 평균 : 71.67
등수 : 2
빼꼼 (32) 학생의 점수는
국어 : 90 영어 : 100 수학 : 20
총점 : 210 평균 : 70.0
등수 : 3
타요 (15) 학생의 점수는
국어 : 90 영어 : 74 수학 : 38
총점 : 202 평균 : 67.33
등수 : 4
루키 (20) 학생의 점수는
국어 : 25 영어 : 100 수학 : 21
총점 : 146 평균 : 48.67
등수 : 9
토니 (53) 학생의 점수는
국어 : 12 영어 : 56 수학 : 100
총점 : 168 평균 : 56.0
등수 : 5
포코 (61) 학생의 점수는
국어 : 69 영어 : 74 수학 : 17
총점 : 160 평균 : 53.33
등수 : 7
import java.util.Arrays;
public class Cashier extends People { // 예쁘게 보려면 학생 클래스 역시 방법 1 로 되어있어야 함.
int salesBook[] = new int[10]; // 0~9번 학생의 누적 구매 금액을 적을 장부 생성.
int salesBookLen = this.salesBook.length;
Student[] stuNum; // Student[0] ~ Student[9] 클래스를 배열로 모두 불러와야 학생 데이터를 사용할 수 있다.
// Step 3.1.
public Cashier(String name, int age, Student[] stuNum) {
super(name, age);
// TODO Auto-generated constructor stub
for(int i = 0; i < salesBookLen; i++) {
this.salesBook[i] = 0; // 생성될 때 0~9번 학생의 누적 구매 장부를 초기화.
}
this.stuNum = stuNum;
}
// Step 3.2. 학생이 구매할 때마다 각각의 학생별 장부에 금액을 누적하는 로직.
public void sale (int buyerNum, int goodsPrice) {
this.salesBook[buyerNum] = this.salesBook[buyerNum] + goodsPrice;
}
// Step 3.2. 구매자(학생)별 매출을 계산하는 로직.
public void salesByBuyer (int buyerNum) {
System.out.println(this.salesBook[buyerNum]);
}
// Step 3.2. 전체 매출을 계산하는 로직.
public int totalSales () {
return Arrays.stream(salesBook).sum();
}
// Step 3.2. 메인 로직.
public String toString() {
System.out.println("매점 직원 : " + super.toString() + " 전체 매출 : " + this.totalSales() + "원");
System.out.println("학생별 매출");
for (int i = 0; i < salesBookLen; i++) {
System.out.println(stuNum[i] + "가 사용한 금액은 : " + this.salesBook[i] + "원");
}
return "";
}
}
결과 :
매점 직원 : 강호동 (49) 전체 매출 : 338407원
학생별 매출
공유 (42)가 사용한 금액은 : 25767원
둘리 (23)가 사용한 금액은 : 36405원
쵸파 (15)가 사용한 금액은 : 38579원
또치 (67)가 사용한 금액은 : 23035원
펭수 (32)가 사용한 금액은 : 37276원
빼꼼 (32)가 사용한 금액은 : 44727원
타요 (15)가 사용한 금액은 : 52927원
루키 (20)가 사용한 금액은 : 38081원
토니 (53)가 사용한 금액은 : 16578원
포코 (61)가 사용한 금액은 : 25032원
또 다른 답안 (Cashier는 미구현)
public class ExecClass {
public static void main(String[] args) {
//// Object 형변환에 대한 설명
// People p1 = new People();
// People p3 = new People("둘리", 30);
//
// Object o1 = (Object)p1;
// System.out.println(p1.name);
// System.out.println(o1);
// System.out.println(p3.toString());
//
// o1.toString();
//// o1.namer 사용 불가능. Object로 형변환 된 o1에는 name이란 변수가 없다. 값만 가지고 있다.
// ((People)o1).name = "123"; // 다시 People로 형변환 하면 가능. People에는 name이란 변수가 있으니까.
Student[] student = new Student[3];
student[0] = new Student("고길동", 50, 20, 30, 30);
student[1] = new Student("둘리", 10000, 10, 40, 10);
student[2] = new Student("또치", 10, 100, 50, 80);
Teacher t1 = new Teacher("희동이", 5, "호이", student);
t1.printStudent();
}
}
public class People {
String name;
int age;
People() {
this.name = "사람";
}
People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return this.name + " (" + this.age + ")";
}
}
public class Student extends People {
int korScore;
int mathScore;
int engScore;
int totalScore;
double avgScore;
Student(String name, int age, int korScore, int mathScore, int engScore) {
super(name, age);
this.korScore = korScore;
this.mathScore = mathScore;
this.engScore = engScore;
this.calcScore();
}
public void calcScore() {
this.totalScore = this.korScore + this.mathScore + this.engScore;
this.avgScore = (double)this.totalScore / 3;
}
}
import java.util.Arrays;
import java.util.Comparator;
public class Teacher extends People {
String className;
Student[] student;
Teacher(String name, int age, String className, Student[] student) {
super(name, age);
this.className = className;
this.setStudent(student);
}
public void setStudent(Student[] student) {
this.student = student;
}
public void sortStudent() {
for (int i = 0; i < student.length; i++) {
for (int j = i + 1; j < student.length; j++) {
if (student[i].totalScore < student[j].totalScore) {
Student temp = student[i];
student[i] = student[j];
student[j] = temp;
}
}
}
}
public void printStudent() {
this.sortStudent();
for (int i = 0; i < student.length; i++) {
System.out.println(student[i] + " 총점 : " + student[i].totalScore);
}
}
}
그리고 Teacher 클래스에서 정렬을 이용해 등수를 구하는 방법.
(단일 배열이 아닌 매트릭스 배열에서 sort 사용하기)
import java.util.Arrays;
import java.util.Comparator;
public class Teacher extends People {
String className;
Student[] student;
Teacher(String name, int age, String className, Student[] student) {
super(name, age);
this.className = className;
this.setStudent(student);
}
public void setStudent(Student[] student) {
this.student = student;
}
// 단일 배열이 아닌 매트릭스 배열에서 sort 사용하기.
public void sortStudent() {
Arrays.sort(this.student, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.totalScore - o1.totalScore; // 오름차순 정렬.
}
});
}
public void printStudent() {
this.sortStudent();
for (int i = 0; i < student.length; i++) {
System.out.println(student[i] + " 총점 : " + student[i].totalScore);
}
}
}
'개발자 > Java' 카테고리의 다른 글
Java (자바) 반올림(올림, 내림) 그리고 자릿수 맞추기(포맷팅) (0) | 2020.04.25 |
---|---|
Java (자바) 플레이어와 몬스터 대전 게임 만들기 (0) | 2020.04.22 |
Java (자바) 프로젝트 가져오기 (Import) (0) | 2020.04.21 |
Java (자바) 상속 - 도형 넓이 구하기 (0) | 2020.04.19 |
Eclipse (이클립스) 자바 프로젝트, 클래스 생성 사라짐 (0) | 2020.04.16 |