본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA] 33강 자바 객체 배열 - 학생 성적 관리

728x90
반응형

 

 

 

 

 

 

- 이번 강좌에서는 객체 배열을 이용해서 학생 성적관리하는 프로그램을 만들어보겠습니다.

- 아직은 학생을 추가하는 것이 아닌 배열을 통해 7명의 학생을 생성하고, 성적을 조회 및 수정하는 것을 해보도록 하겠습니다. 

 

 

 

 

 

 

 

 

 

 

1. 학생 클래스 생성


- 학생 클래스를 Student.java로 생성합니다.

- 이때 main() 함수를 처리하지 않습니다.

- 멤버변수는 학년, 반, 번호, 이름, 국어점수, 영어점수, 수학점수로 처리하겠습니다.

- 이때 학년과 반은 1학년 1반으로 처리하겠습니다. 

- 메서드는 학생 정보를 출력하는 메서드를 만들도록 하겠습니다.

- 게터/세터도 만들어서 국어, 영어, 점수 데이터를 관리하겠습니다. 

- 추후에 이름과 번호로 가져다 쓸거라 게터로 처리하겠습니다. 

 

 

## Student.java

package ch18_array;

public class Student {
	private static int serialNum = 0;
	private int studentId;
	private int grade;
	private int classNum;
	private String name;
	private int kor, eng, math;
	
	//생성자 - 이름으로만 생성, 아이디만 증가, 나머지 고정 처리
	//점수는 기본 값인 0으로 모두 처리
	public Student(String name) {
		this.grade = 1;
		this.classNum = 1;
		serialNum++;
		this.studentId = serialNum;
		this.name = name;
	}
	
	//학생 정보 출력 메서드
	public void printInfo() {
		System.out.println("==============");
		System.out.println("학년 : " + grade);
		System.out.println("반 : " + classNum);
		System.out.println("번호 : " + studentId);
		System.out.println("이름 : " + name);
		System.out.println("국어성적 : " + kor);
		System.out.println("영어성적 : " + eng);
		System.out.println("수학성적 : " + math);
		System.out.println("==============");
	}

	//게터세터
	public int getStudentId() {
		return studentId;
	}
	public String getName() {
		return name;
	}
	
	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 5명 학생 인스턴스 생성


- StudentMain.java로 생성합니다.

- 이때 main() 함수를 처리합니다. 

- 학생 이름 7명을 배열에 담고, 객체도 인스턴스를 7개로 생성합니다. 

 

 

## StudentMain.java - 코드

package ch18_array;

public class StudentMain {

	public static void main(String[] args) {
		//학생 이름을 담는 배열
		String[] names = new String[] {"김남준","김석진","민윤기","정호석","박지민","김태형","전정국"};
		
		//학생 전체를 담는 배열
		Student[] stds = new Student[7];
		
		//학생 한명한명의 인스턴스 생성
		for(int i=0;i<stds.length;i++) {
			stds[i] = new Student(names[i]);
			stds[i].printInfo(); //학생정보출력 - 테스트 후 삭제
		}
	}
}

- 결과를 확인하고 나면 [ stds[i].printInfo(); ]를 삭제해줍니다.

 

 

 

## StudentMain.java - 결과

- 그럼 7명에 대한 정보를 모두 출력하는 것을 확인할 수 있습니다.

- 이때 번호는 알아서 1씩 증가하는 것 보이죠?

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

3. 성적 수정 및 조회 프로그램


- 이번에는 성적을 수정하고 조회하는 프로그램을 만들어 보겠습니다. 

 

 

 

 

1) 메인메뉴 출력

=======메뉴=======
1. 성적수정
2. 성적조회
3. 프로그램 종료
메뉴 선택 :

- 반복문을 통해 메뉴를 사용자에게 반환받도록 처리하겠습니다.

- 1번 누르면 성적 수정 파트로, 2번 누르면 성적조회파트로, 3번 누르면 반복을 종료하겠습니다. 

 

 

## StudentMain.java - 코드

package ch18_array;

import java.util.Scanner;

public class StudentMain {

	public static void main(String[] args) {
		//학생 이름을 담는 배열
		String[] names = new String[] {"김남준","김석진","민윤기","정호석","박지민","김태형","전정국"};
		
		//학생 전체를 담는 배열
		Student[] stds = new Student[7];
		
		//학생 한명한명의 인스턴스 생성
		for(int i=0;i<stds.length;i++) {
			stds[i] = new Student(names[i]);
		}
		
		Scanner scan = new Scanner(System.in); //스캐너 출력
		
		int menu; //메뉴 번호를 받을 변수
		
		//프로그램을 종료하기 전까지 계속 실행할 반복문
		do {
			//메뉴 출력
			System.out.println("=======메뉴=======");
			System.out.println("1. 성적수정");
			System.out.println("2. 성적조회");
			System.out.println("3. 프로그램 종료");
			
			System.out.print("메뉴 선택 : ");
			
			//메뉴를 입력받을 변수 처리
			menu = scan.nextInt();
			
			//입력한 번호에 따른 명령 처리
			switch(menu) {
			case 1:
				System.out.println("성적수정메뉴"); //테스트 후 삭제
				break;
			case 2:
				System.out.println("성적조회메뉴"); //테스트 후 삭제
				break;
			case 3:
				System.out.println("프로그램을 종료합니다.");
				break;
			default:
				System.out.println("1~3사이의 정수를 입력하세요.");
				break; //입력하지 않아도 마지막이라 처리 잘됨
			}
		}while(menu != 3); //menu가 3번이 아니면 계속 반복
		
		
		scan.close(); //스캐너 종료
	}
}

- 반복적으로 메뉴를 출력하고, 3을 누르면 반복을 종료하도록 처리했습니다.

- 자세한 설명은 주석으로 달아놨으니 확인해 보세요.

- switch문의 case1과 case2의 출력문은 테스트 후 삭제하겠습니다.

 

 

 

## StudentMain.java - 결과

- 5를 입력하면 1~3 사이 정수를 입력하라고 나오고, 또 메뉴가 출력을 합니다.

- 3을 누르면 반복문이 종료가 됩니다. 

 

 

 

 


 

 

 

 

2) 성적수정 메뉴 출력

=====성적수정=====
1. 국어
2. 영어
3. 수학
과목 선택 : 1
학생 번호 : 1
성적 입력 : 90
1번의 국어 점수가 90점으로 변경되었습니다.

- 성적 수정은 과목을 먼저 선택하겠습니다.

- 그리고 학생 번호를 입력하고 성적을 입력하면 변경되도록 하겠습니다.

- 과목선택이 1~3이 아니면, [과목번호는 1~3사이 정수를 입력하세요]라고 알림 문구를 처리합니다. 

- 학생 번호가 1~7이 아니면, [학생번호가 잘못되었습니다]라고 알림 문구를 처리합니다.

- 점수가 0~100점 사이가 아니면, [성적은 0~100 사이 정수를 입력하세요.]라고 알림 문구를 처리합니다. 

 

 

 

## StudentMain.java - 코드 - case 1

package ch18_array;

import java.util.Scanner;

public class StudentMain {

	public static void main(String[] args) {
		//학생 이름을 담는 배열
		String[] names = new String[] {"김남준","김석진","민윤기","정호석","박지민","김태형","전정국"};
		
		//학생 전체를 담는 배열
		Student[] stds = new Student[7];
		
		//학생 한명한명의 인스턴스 생성
		for(int i=0;i<stds.length;i++) {
			stds[i] = new Student(names[i]);
		}
		
		Scanner scan = new Scanner(System.in); //스캐너 출력
		
		int menu; //메뉴 번호를 받을 변수
		
		//프로그램을 종료하기 전까지 계속 실행할 반복문
		do {
			//메뉴 출력
			System.out.println("=======메뉴=======");
			System.out.println("1. 성적수정");
			System.out.println("2. 성적조회");
			System.out.println("3. 프로그램 종료");
			
			System.out.print("메뉴 선택 : ");
			
			//메뉴를 입력받을 변수 처리
			menu = scan.nextInt();
			
			//입력한 번호에 따른 명령 처리
			switch(menu) {
			case 1:
				//메뉴 출력
				System.out.println("=====성적수정=====");
				System.out.println("1. 국어");
				System.out.println("2. 영어");
				System.out.println("3. 수학");
				System.out.print("과목 선택 : ");
				
				//과목 선택 변수
				int subject = scan.nextInt();
				if(subject >= 1 && subject <= 3) { //1~3으로만 처리
					System.out.print("학생 번호 : ");
					
					//학생번호담는 변수
					int num = scan.nextInt();
					
					if(num >= 1 && num <= 7) {
						System.out.print("성적 입력 : ");
						
						//성적담는 변수
						int score = scan.nextInt();
						
						if(score >= 0 && score <= 100) {
							//학생점수 변경 - 과목에 따라 다름
							switch(subject) {
							case 1: //국어
								stds[num - 1].setKor(score);
								System.out.println(num + "번의 국어 점수가 " + stds[num - 1].getKor() + "점으로 변경되었습니다.");
								break;
							case 2: //영어
								stds[num - 1].setEng(score);
								System.out.println(num + "번의 영어 점수가 " + stds[num - 1].getEng() + "점으로 변경되었습니다.");
								break;
							case 3: //수학
								stds[num - 1].setMath(score);
								System.out.println(num + "번의 수학 점수가 " + stds[num - 1].getMath() + "점으로 변경되었습니다.");
								break;
							}
						}else {
							System.out.println("성적은 0~100사이 정수를 입력하세요.");
						}
					}else {
						System.out.println("학생번호가 잘못되었습니다.");
					}
				}else {
					System.out.println("과목번호는 1~3사이 정수를 입력하세요");
				}
				
				break;
			case 2:
				
				break;
			case 3:
				System.out.println("프로그램을 종료합니다.");
				break;
			default:
				System.out.println("1~3사이의 정수를 입력하세요.");
				break; //입력하지 않아도 마지막이라 처리 잘됨
			}
		}while(menu != 3); //menu가 3번이 아니면 계속 반복
		
		
		scan.close(); //스캐너 종료
	}
}

- 주석으로 설명을 달아놨으니, 확인해 보면 됩니다.

- case 1의 경우 매우 복잡한 것이 확인이 됩니다.

- 이럴 때는 메서드를 따로 선언해서 호출해 오면 더 보기가 좋습니다.

- 이건 case 2까지 한 후 처리하겠습니다. 

 

 

## StudentMain.java - 결과 - case 1

 

 

 

 


 

 

 

 

3) 성적조회 메뉴 출력

=====성적조회=====
1. 과목별조회
2. 학생별조회
메뉴 선택 : 1
1. 국어
2. 영어
3. 수학
과목 선택 : 1
=====국어점수=====
1. 김남준 : 90
...

=====성적조회=====
1. 과목별조회
2. 학생별조회
메뉴 선택 : 2
번호 선택 : 1
학생 정보 출력

- 성적 조회는 2개로 나누겠습니다.

- 과목별로 조회하는 것과 학생별로 조회하는 것으로 나누겠습니다.

- 과목별로 조회 시 해당 과목점수를 학생 모두 보여주겠습니다.

- 학생별로 조회하는 경우 번호를 선택해서 학생 정보 자체를 출력(printInfo())을 하겠습니다. 

 

 

 

## StudentMain.java - 코드 - case 2

package ch18_array;

import java.util.Scanner;

public class StudentMain {

	public static void main(String[] args) {
		//학생 이름을 담는 배열
		String[] names = new String[] {"김남준","김석진","민윤기","정호석","박지민","김태형","전정국"};
		
		//학생 전체를 담는 배열
		Student[] stds = new Student[7];
		
		//학생 한명한명의 인스턴스 생성
		for(int i=0;i<stds.length;i++) {
			stds[i] = new Student(names[i]);
		}
		
		Scanner scan = new Scanner(System.in); //스캐너 출력
		
		int menu; //메뉴 번호를 받을 변수
		
		//프로그램을 종료하기 전까지 계속 실행할 반복문
		do {
			//메뉴 출력
			System.out.println("=======메뉴=======");
			System.out.println("1. 성적수정");
			System.out.println("2. 성적조회");
			System.out.println("3. 프로그램 종료");
			
			System.out.print("메뉴 선택 : ");
			
			//메뉴를 입력받을 변수 처리
			menu = scan.nextInt();
			
			//입력한 번호에 따른 명령 처리
			switch(menu) {
			case 1:
				//메뉴 출력
				System.out.println("=====성적수정=====");
				System.out.println("1. 국어");
				System.out.println("2. 영어");
				System.out.println("3. 수학");
				System.out.print("과목 선택 : ");
				
				//과목 선택 변수
				int subject = scan.nextInt();
				if(subject >= 1 && subject <= 3) { //1~3으로만 처리
					System.out.print("학생 번호 : ");
					
					//학생번호담는 변수
					int num = scan.nextInt();
					
					if(num >= 1 && num <= 7) {
						System.out.print("성적 입력 : ");
						
						//성적담는 변수
						int score = scan.nextInt();
						
						if(score >= 0 && score <= 100) {
							//학생점수 변경 - 과목에 따라 다름
							switch(subject) {
							case 1: //국어
								stds[num - 1].setKor(score);
								System.out.println(num + "번의 국어 점수가 " + stds[num - 1].getKor() + "점으로 변경되었습니다.");
								break;
							case 2: //영어
								stds[num - 1].setEng(score);
								System.out.println(num + "번의 영어 점수가 " + stds[num - 1].getEng() + "점으로 변경되었습니다.");
								break;
							case 3: //수학
								stds[num - 1].setMath(score);
								System.out.println(num + "번의 수학 점수가 " + stds[num - 1].getMath() + "점으로 변경되었습니다.");
								break;
							}
						}else {
							System.out.println("성적은 0~100사이 정수를 입력하세요.");
						}
					}else {
						System.out.println("학생번호가 잘못되었습니다.");
					}
				}else {
					System.out.println("과목번호는 1~3사이 정수를 입력하세요");
				}
				
				break;
			case 2:
				//메뉴 출력
				System.out.println("=====성적조회=====");
				System.out.println("1. 과목별조회");
				System.out.println("2. 학생별조회");
				System.out.print("메뉴 선택 : ");
				
				//메뉴 담는 변수
				int scoreMenu = scan.nextInt();
				
				switch(scoreMenu) {
				case 1: //과목별 조회
					System.out.println("1. 국어");
					System.out.println("2. 영어");
					System.out.println("3. 수학");
					System.out.print("과목 선택 : ");
					
					//과목 담는 변수
					int subjectMenu = scan.nextInt();
					
					switch(subjectMenu) {
					case 1: //국어 출력
						System.out.println("=====국어점수=====");
						for(int i=0;i<names.length;i++) {
							System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getKor());
						}
						break;
					case 2: //영어 출력
						System.out.println("=====영어점수=====");
						for(int i=0;i<names.length;i++) {
							System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getEng());
						}
						break;
					case 3: //수학 출력
						System.out.println("=====수학점수=====");
						for(int i=0;i<names.length;i++) {
							System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getMath());
						}
						break;
					default: 
						System.out.println("메뉴를 잘못선택했습니다.(1~3)");
						break;
					}
					break;
				case 2: //학생별 조회
					System.out.print("번호 입력 : ");
					
					//학생 번호 담는 변수
					int num = scan.nextInt();
					
					//학생 번호가 1~7이면
					if(num >= 1 && num <= 7) {
						stds[num - 1].printInfo(); //해당 학생 정보만 출력
					}else {
						System.out.println("학생번호가 잘못되었습니다.");
					}
					break;
				default:
					System.out.println("메뉴를 잘못선택했습니다.(1~2)");
					break;
				}
				
				break;
			case 3:
				System.out.println("프로그램을 종료합니다.");
				break;
			default:
				System.out.println("1~3사이의 정수를 입력하세요.");
				break; //입력하지 않아도 마지막이라 처리 잘됨
			}
		}while(menu != 3); //menu가 3번이 아니면 계속 반복
		
		
		scan.close(); //스캐너 종료
	}
}

- 주석으로 설명을 달아놨으니, 확인해 보면 됩니다.

- case 2도 경우 매우 복잡한 것이 확인이 됩니다.

- 이럴 때는 메서드를 따로 선언해서 호출해 오면 더 보기가 좋습니다.

 

 

## StudentMain.java - 결과 - case 2

 

 

 

 


 

 

 

 

4) 코드 세분화

- 지금 보면 코드가 매우 많아서 보기가 어렵습니다.

- 이럴 때는 메서드로 처리한 후 호출만 해서 사용하면 더 보기 좋습니다.

- 그래서 큰 메뉴 출력, 성적 수정, 성적 조회를 함수로 선언 후 호출해서 사용해 보겠습니다.

 

 

 

## StudentMain.java - 코드 - 코드 세분화

package ch18_array;

import java.util.Scanner;

public class StudentMain {
	//외부 메서드들도 사용하기 때문에 static으로 처리
	public static Scanner scan = new Scanner(System.in); //스캐너 출력
	
	//학생 전체를 담는 배열 - 외부 메서드들도 사용하기 때문에 static으로 처리
	public static Student[] stds = new Student[7];
	
	//학생 이름을 담는 배열 - 외부 메서드들도 사용하기 때문에 static으로 처리
    public static String[] names = new String[] {"김남준","김석진","민윤기","정호석","박지민","김태형","전정국"};
			
			
	public static void main(String[] args) {
		//학생 한명한명의 인스턴스 생성
		for(int i=0;i<stds.length;i++) {
			stds[i] = new Student(names[i]);
		}
		
		
		int menu; //메뉴 번호를 받을 변수
		
		//프로그램을 종료하기 전까지 계속 실행할 반복문
		do {
			//메뉴 출력 - 호출해서 처리
			printMenu();
			
			
			//메뉴를 입력받을 변수 처리
			menu = scan.nextInt();
			
			//입력한 번호에 따른 명령 처리
			switch(menu) {
			case 1:
				//성적 수정 - 호출해서 처리
				updateScore();
				
				break;
			case 2:
				//성적 조회 - 호출해서 처리
				viewScore();
				
				break;
			case 3:
				System.out.println("프로그램을 종료합니다.");
				break;
			default:
				System.out.println("1~3사이의 정수를 입력하세요.");
				break; //입력하지 않아도 마지막이라 처리 잘됨
			}
		}while(menu != 3); //menu가 3번이 아니면 계속 반복
	}


	//1. 큰 메뉴 출력
	public static void printMenu() {
		System.out.println("=======메뉴=======");
		System.out.println("1. 성적수정");
		System.out.println("2. 성적조회");
		System.out.println("3. 프로그램 종료");
		
		System.out.print("메뉴 선택 : ");	
	}
	
	//2. 성적 수정
	public static void updateScore() {
		//메뉴 출력
		System.out.println("=====성적수정=====");
		System.out.println("1. 국어");
		System.out.println("2. 영어");
		System.out.println("3. 수학");
		System.out.print("과목 선택 : ");
		
		//과목 선택 변수
		int subject = scan.nextInt();
		if(subject >= 1 && subject <= 3) { //1~3으로만 처리
			System.out.print("학생 번호 : ");
			
			//학생번호담는 변수
			int num = scan.nextInt();
			
			if(num >= 1 && num <= 7) {
				System.out.print("성적 입력 : ");
				
				//성적담는 변수
				int score = scan.nextInt();
				
				if(score >= 0 && score <= 100) {
					//학생점수 변경 - 과목에 따라 다름
					switch(subject) {
					case 1: //국어
						stds[num - 1].setKor(score);
						System.out.println(num + "번의 국어 점수가 " + stds[num - 1].getKor() + "점으로 변경되었습니다.");
						break;
					case 2: //영어
						stds[num - 1].setEng(score);
						System.out.println(num + "번의 영어 점수가 " + stds[num - 1].getEng() + "점으로 변경되었습니다.");
						break;
					case 3: //수학
						stds[num - 1].setMath(score);
						System.out.println(num + "번의 수학 점수가 " + stds[num - 1].getMath() + "점으로 변경되었습니다.");
						break;
					}
				}else {
					System.out.println("성적은 0~100사이 정수를 입력하세요.");
				}
			}else {
				System.out.println("학생번호가 잘못되었습니다.");
			}
		}else {
			System.out.println("과목번호는 1~3사이 정수를 입력하세요");
		}
		
	}
	
	//3. 성적 조회
	public static void viewScore() {
		//메뉴 출력
		System.out.println("=====성적조회=====");
		System.out.println("1. 과목별조회");
		System.out.println("2. 학생별조회");
		System.out.print("메뉴 선택 : ");
		
		//메뉴 담는 변수
		int scoreMenu = scan.nextInt();
		
		switch(scoreMenu) {
		case 1: //과목별 조회
			System.out.println("1. 국어");
			System.out.println("2. 영어");
			System.out.println("3. 수학");
			System.out.print("과목 선택 : ");
			
			//과목 담는 변수
			int subjectMenu = scan.nextInt();
			
			switch(subjectMenu) {
			case 1: //국어 출력
				System.out.println("=====국어점수=====");
				for(int i=0;i<names.length;i++) {
					System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getKor());
				}
				break;
			case 2: //영어 출력
				System.out.println("=====영어점수=====");
				for(int i=0;i<names.length;i++) {
					System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getEng());
				}
				break;
			case 3: //수학 출력
				System.out.println("=====수학점수=====");
				for(int i=0;i<names.length;i++) {
					System.out.println(stds[i].getStudentId() + ". " + stds[i].getName() + " : " + stds[i].getMath());
				}
				break;
			default: 
				System.out.println("메뉴를 잘못선택했습니다.(1~3)");
				break;
			}
			break;
		case 2: //학생별 조회
			System.out.print("번호 입력 : ");
			
			//학생 번호 담는 변수
			int num = scan.nextInt();
			
			//학생 번호가 1~7이면
			if(num >= 1 && num <= 7) {
				stds[num - 1].printInfo(); //해당 학생 정보만 출력
			}else {
				System.out.println("학생번호가 잘못되었습니다.");
			}
			break;
		default:
			System.out.println("메뉴를 잘못선택했습니다.(1~2)");
			break;
		}		
	}
}

- 큰 메뉴 출력은 printMenu()라는 메서드로 처리했습니다.

- 성적수정은 updateScore()라는 메서드로 처리했습니다.

- 성적조회는 viewScore()라는 메서드로 처리했습니다.

- 스캐너 및 배열과 인스턴스를 다른 메서드들도 사용하기 때문에 static으로 처리합니다.

- 이렇게 코드가 많은 경우는 메서드로 나눠서 명령을 처리하고 파일도 구분하는 것이 좋습니다.

- 파일 분리는 추후에 다른 내용들을 더 배운 후 보도록 하겠습니다. 

 

 

 

 

 

 

728x90
반응형