본문 바로가기

📚Study Note/JAVA

[ JAVA ] 흔해빠진 int[ ] 이 아닌 클래스 '객체' 가 들어있는 배열(feat. Record [ ]

/*==========================================
 ■■■  클래스와 인스턴스 ■■■
   - 클래스와 인스턴스 활용
 ===========================================*/

 //  ● 실습 문제
 // 학생별로 국어점수, 영어점수 , 수학점수를 입력받아 
 // 총점 ,평균을 산출하는 프로그램을 구현한다. 
 // 단, 클래스의 개념을 황용하여 작성할 수 있도록 한다.
 // 또한, 이 과정에서 배열을 적극적으로 활용할 수 있도록 한다.
 // 마지막으로 다음의 요구사항을 충족할 수 있도록 설계한다.

 // 프로그램을 구성하는 클래스
 // 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
계속하려면 아무 키나 누르십시오 . . .*/