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);
		}
	}
}

+ Recent posts