/*==========================================
■■■ 클래스와 인스턴스 ■■■
- 클래스와 인스턴스 활용
===========================================*/
// ● 실습 문제
// 학생별로 국어점수, 영어점수 , 수학점수를 입력받아
// 총점 ,평균을 산출하는 프로그램을 구현한다.
// 단, 클래스의 개념을 황용하여 작성할 수 있도록 한다.
// 또한, 이 과정에서 배열을 적극적으로 활용할 수 있도록 한다.
// 마지막으로 다음의 요구사항을 충족할 수 있도록 설계한다.
// 프로그램을 구성하는 클래스
// 1, Record클래스 - 속성만 존재하는 클래스로 설계할 것!!!! 메소드없이 변수만 있는 클래스를 말한다.
// 2. Sungjuk 클래스 - 인원 수를 입력받아, 입력받은 인원 수 만큼 이름, 국어점수, 영어점수, 수학점수를 입력받고,
// 총점과 평균을 산출하는 클래스로 설계할것!!!!
// 속성 : 인원수, ★Record 형태의 배열!
// 기능 : 인원 수 입력, 상세데이터 입력, 총점과 평균을 산출, 결과를 출력하는 메소드이다
// 3. Test094클래스
// - main() 메소드가 존재하는 외부의 다른 클래스로 설계할 것!
사실 이 부분이 처음에 들었을 때는 쉽게 이해되지 않았던 부분이다. 배열 안에 int, String, char 가 아닌(사실 String도 클래스이기는 하다만) 객체가 들어간다는 것은...
class Record
{ String name;
int num1, num2;
}
Record ob1= new Record();
Record ob2= new Record();
Record ob3= new Record();
Record[] obArr = new Record[3];
Record[] obArr = {ob1,ob2,ob3};
ob1 | ob2 | ob3 |
obArr[0].name = "홍길동"; → ob1.name = "홍길동";
obArr[0].num1 = 90; → ob1.num1 = 90;
obArr[0].num2 = 80; → ob1.num2 = 80;
public class Record
{
String name;
int[] score = new int[3]; //static int korean, math, english;
int tot; //국영수 성적을 담을 배열
double avg;
int rank;
}
배열 안에 들어갈 Record 객체를 생성할 수 있는 클래스. 이름과 길이가 3인 점수배열, 총점, 평균, 등수라는 속성들이 있다.
import java.util.Scanner;
public class Sungjuk
{
int inwon; //인원수
Record[] recArr; // 레코드배열 학생1명당 레코드배열방 1개 활용
// 기능 : 인원 수 입력, 상세데이터 입력, 총점과 평균을 산출, 결과를 출력하는 메소드이다
// 인원수 입력하는 메소드
void set()
{
Scanner sc = new Scanner(System.in);
do
{
System.out.print("인원 수 입력(1~100) : ");
inwon = sc.nextInt();
}
while (inwon<1 || inwon>100); //논리연산자 세우기는 어려운 것은 아니지만 조심해야함 자바가 에러로 분류안하기 때문이다
recArr = new Record[inwon]; //Record클래스를 기반으로 생성된 객체(인스턴스)를 담을 수 있는배열방을 inwon만큼 생성한 것이지 Record클래스의 인스턴스를 생성한 것은 아니다.
}//set() 메소드 끝
public void input()
{
Scanner sc = new Scanner(System.in);
String[] subTitle = {"국어 점수 : " , "영어 점수 : " , "수학 점수 : "};
for (int i=0; i<inwon; i++) //inwon ==recArr.length
{
//값을 담기 위해서는 Record클래스 기반의 인스턴스 생성
//Record rec = new Record();
recArr[i] = new Record();
System.out.printf("%d번째 학생의 이름 입력 : ",i+1);
recArr[i].name = sc.next();
/*
System.out.printf("%d번째 학생의 이름 입력 : ",i+1);
recArr[i].name = sc.next();
System.out.print("국어 점수 : ");
recArr[i].score[0] = sc.nextInt();
recArr[i].tot += recArr[i].score[0];
System.out.print("수학 점수 : ");
recArr[i].score[1] = sc.nextInt();
System.out.print("영어 점수 : ");
recArr[i].score[2] = sc.nextInt();
recArr[i].tot += recArr[i].score[2];
*/
for (int j=0 ; j<subTitle.length; j++) //0,1,2
{
System.out.print(subTitle[j]);
recArr[i].score[j] = sc.nextInt();
recArr[i].tot +=recArr[i].score[j];
}
//평균산출하기
recArr[i].avg = recArr[i].tot / 3.0 ;
}
}//end input
void print()
{
//석차 산출 메소드 호출
ranking();
System.out.println();
for (int i=0; i<inwon; i++)
{
System.out.printf("%5s",recArr[i].name);
for (int j=0; j<3; j++)
{
System.out.printf("%4d",recArr[i].score[j]);
}
System.out.printf("%5d", recArr[i].tot);
System.out.printf("%8.2f", recArr[i].avg);
//석차 출력 구문 추가
System.out.printf("%5d", recArr[i].rank);
//개행
System.out.println();
}
}//end print()
//메소드 석차산출 메소드 추가 정의한다.
void ranking()
{
int i, j ;
//모든 학생들의 등수(석차)를 1로 초기화
for (i=0; i<inwon; i++)//모든 학생들의 등수를 1로초기화한다
{
recArr[i].rank=1;
}
for (i=0; i<inwon-1; i++) //비교대상은 i로 비교기준은 j로 설정한다
{
for (j=i+1; j<inwon; j++)
{
if (recArr[i].avg> recArr[j].avg) //기준데이터 평균이 비교데이터의 평균보다 크다면 비교데이터의 성적을 하나 더한다(1등 → 2등)
{
recArr[j].rank++;
}
else if(recArr[i].avg< recArr[j].avg)
{
recArr[i].rank++;
}
}
}//end for()
}//end ranking()
}
1. 인원수를 입력받고 set() 메소드는 Record 클래스를 기반으로 생성된 객체(인스턴스)를 담을 수 있는 배열을 생성한다.
2. input () 메소드는 인원 수를 기반으로 학생들의 이름과 내부 for문을 통해서 국,영,수 점수를 입력받는다. 그것을 기반으로 총점과 평균도 계산한다 .
3. ranking() 메소드는 1,2,3이 있다고 하면 1을 2,3과 비교하고 2를 3과 비교하는 형식으로 등수를 계산한다.
4. print() 메소드에서는 위에서 구한 Record클래스의 인스턴스변수들을 출력해준다.
public class Test094
{
public static void main(String[] args)
{
Sungjuk ob = new Sungjuk();
ob.set();
ob.input();
ob.print();
ob.ranking();
}
}
[출력결과]
인원 수 입력(1~100) : 3
1번째 학생의 이름 입력 : 봉봉이
국어 점수 : 50
영어 점수 : 60
수학 점수 : 70
2번째 학생의 이름 입력 : 징징이
국어 점수 : 70
영어 점수 : 80
수학 점수 : 90
3번째 학생의 이름 입력 : 웅웅이
국어 점수 : 80
영어 점수 : 90
수학 점수 : 100
봉봉이 50 60 70 180 60.00 3
징징이 70 80 90 240 80.00 2
웅웅이 80 90 100 270 90.00 1
계속하려면 아무 키나 누르십시오 . . .*/
'📚Study Note > JAVA' 카테고리의 다른 글
[ JAVA ] 배열의 복사 - 얕은복사와 깊은복사 (주소값 복사와 데이터복사) (0) | 2021.03.26 |
---|---|
[ JAVA ] 메소드 오버로딩 (Method Overloading) 이 가능한 경우와 아닌 경우 (0) | 2021.03.25 |
[ JAVA ] 정보은닉(private) , static 변수와 static 메소드 (0) | 2021.03.25 |
[ JAVA ] 배열 Array ② 배열의 배열(2차원 배열) (0) | 2021.03.14 |
[ JAVA ] 배열 Array 의 선언, 초기화, 기본적인 사용 (0) | 2021.03.14 |