java | class, score 예제

자경·2024년 8월 18일
0

자바

목록 보기
1/1
import java.util.Scanner;

class stu_score{
	String num;
	String name;
	int score[];
	double aver;
	char gra; //절대평가 
	int rank; //상대평가
}

public class Score_1302{
	public static void main(String args[]){
		
		Scanner in = new Scanner(System.in);
		
		System.out.print("학생 수 입력 : ");
		int stu_num=in.nextInt();
		
		stu_score stu_s[] = new stu_score[stu_num+1];
		String subj[] = {"국어","영어","수학","자바"};

		for(int i=0; i<stu_num; i++){ //학생 수 만큼 돌아간다. 왜냐면 한 학생의 점수를 전부 입력하기 때무니다.

			System.out.print("학번 : ");
			stu_s[i].num = in.next();
			System.out.print("이름 : ");
			stu_s[i].name = in.next();
			stu_s[i].score=new int[5];

			for(int j=0; j<4; j++) {
				do{
					System.out.print(subj[j]+"점수 : ");
					stu_s[i].score[j] = in.nextInt();
				}while((0>stu_s[i].score[j] || stu_s[i].score[j]>100));
				
			}
			stu_s[i].score[4] = method_sum(stu_s[i].score[3],stu_s[i].score[2],stu_s[i].score[1],stu_s[i].score[0]);
			stu_s[i].aver= (double)stu_s[i].score[4]/4;

			switch((int)stu_s[i].aver/10){
				case 9: case 10: stu_s[i].gra='A'; break;
				case 8: stu_s[i].gra='B'; break;
				case 7: stu_s[i].gra= 'C'; break;
				case 6: stu_s[i].gra = 'D'; break;
				default : stu_s[i].gra='E'; 
			}
			System.out.println();
			stu_s[i].rank = 1;	
		}
		in.close();
		
		for(int i=0; i<stu_num-1; i++){ 
			for(int j=i+1; j<stu_num; j++){
				if(stu_s[i].score[i]>stu_s[i].score[j]) stu_s[i].rank++;
				else if(stu_s[i].score[i]<stu_s[i].score[j]) stu_s[i].rank++;
			}
		}
		for(int i=0; i<stu_num; i++){
				System.out.printf("%5s %7s %5d %5d %5d %5d %6d %8.2f %5c %5d\n",stu_s[i].num,stu_s[i].name,stu_s[i].score[0],stu_s[i].score[1],stu_s[i].score[2],stu_s[i].score[3],stu_s[i].score[4],stu_s[i].aver,stu_s[i].gra,stu_s[i].rank);
		}
		//학번순 출력 
		/*
		else if(menu==2) {
			for(int i=0; i<stu_num; i++) {
				for(int j=i; j<stu_num-1; j++) {
					
				}
			}
		}
		*/

	}//end of main

	static int method_sum(int kor, int eng, int math, int java){
		return (kor+eng+math+java);
	}
}

문제발생,

Exception in thread "main" java.lang.NullPointerException: Cannot assign field "num" because "stu_s[i]" is null
at Score_1302.main(Score_1302.java:26)

해결,

각 배열 요소를 인스턴스화

왜?

왜 각 배열 요소의 인스턴스화를 해야되고 그게 무엇인가...

배열의 선언만으로 각 요소가 객체로서 초기화되지 않아서이다.

결론

class명 배열이름 = new 클래스[배열개수];
그냥 해당 클래스 타입의 객체 배열을 만든거다.
아직 클래스 객체를 직접 참조하지 않았다.
그래서 전부 null로 초기화 되어있다.

그렇기에 for문을 돌려 전부 class의 객체를 직접 가르키도록 해주는 것이다.

대박 java신님 감사합니다.

0개의 댓글