- 이번 강좌에서는 객체 배열을 이용해서 학생 성적관리하는 프로그램을 만들어보겠습니다.
- 아직은 학생을 추가하는 것이 아닌 배열을 통해 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씩 증가하는 것 보이죠?
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으로 처리합니다.
- 이렇게 코드가 많은 경우는 메서드로 나눠서 명령을 처리하고 파일도 구분하는 것이 좋습니다.
- 파일 분리는 추후에 다른 내용들을 더 배운 후 보도록 하겠습니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 35강 ArrayList 클래스 (0) | 2024.01.29 |
---|---|
[JAVA강좌] 34강 다차원 배열 (0) | 2024.01.29 |
[JAVA강좌] 32강 자바 배열 - 배스킨라빈스31게임 (0) | 2024.01.29 |
[JAVA강좌] 31강 자바 배열 - 로또 프로그램 (1) | 2024.01.29 |
[JAVA강좌] 30강 배열 정렬 - sort() (0) | 2024.01.26 |