- 지난번 강좌인 자바객체배열에서 학생성적관리 프로그램을 한 적이 있습니다.
https://ossam5.tistory.com/648
- 이때는 일반 배열을 선택하다 보니 학생 7명을 미리 등록하고 시작을 했습니다.
- 더 추가하려면 배열을 복제해 개수를 추가하는 복잡한 방법을 사용했어야 하나, ArrayList를 사용하면 편합니다.
- 이번에는 학생을 추가, 조회하는 것을 해서 배열 개수와 관계없이 ArrayList를 활용해 보겠습니다.
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.print(grade + "학년 ");
System.out.print(classNum + "반 ");
System.out.print(studentId + "번, ");
System.out.print("이름 : " + name + ", ");
System.out.print("국어성적 : " + kor + ", ");
System.out.print("영어성적 : " + eng + ", ");
System.out.println("수학성적 : " + math);
}
//게터세터
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;
}
}
- 지난 강좌에서 만든 것과 다르지 않습니다.
- 출력 printInfo() 메서드만 한줄로 출력되도록 처리했습니다.
2. 학생 성적관리 프로그램 제작
- StudentArrayMain.java로 생성합니다.
- 이때 main() 함수를 처리합니다.
- 이번에는 ArrayList를 통해 객체를 제작합니다.
- 큰 메뉴는 학생추가, 학생조회로 나누겠습니다.
- 큰 틀만 먼저 제작을 해보겠습니다.
## StudentArrayMain.java
package ch18_array;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentArrayMain {
//외부 메서드들도 사용하기 때문에 static으로 처리
public static Scanner scan = new Scanner(System.in); //스캐너 출력
//학생들을 담을 배열 - 외부 메서드들도 사용하기 때문에 static으로 처리
//몇명이 담길지 모르기 때문에 ArrayList사용
public static ArrayList<Student> stds = new ArrayList<Student>();
public static void main(String[] args) {
int menu; //메뉴 번호를 받을 변수
//프로그램을 종료하기 전까지 계속 실행할 반복문
do {
//첫 메뉴 출력
printMenu();
//메뉴를 입력받을 변수 처리
menu = scan.nextInt();
//입력한 번호에 따른 명령 처리
switch(menu) {
case 1:
//학생추가
addStudent();
break;
case 2:
//학생조회
viewStudent();
break;
case 3:
System.out.println("프로그램을 종료합니다.");
break;
default:
System.out.println("1~3사이의 정수를 입력하세요.");
break; //입력하지 않아도 마지막이라 처리 잘됨
}
}while(menu != 3); //menu가 3가 아니면 계속 반복
}
//첫 메뉴 출력
public static void printMenu() {
}
//학생추가
public static void addStudent() {
}
//학생조회
public static void viewStudent() {
}
}
- 스캐너를 다른 메서드에서도 사용할 거라 static으로 선언했습니다.
- 학생을 담을 배열은 다른 메서드에서도 사용할 거라 static으로 선언하고, 몇 명 일지 알 수 없기 때문에 ArrayList를 사용했습니다.
- 큰 메뉴출력을 후 각각 메뉴에 대한 명령을 메서드로 처리를 했습니다.
- 아직 메서드는 담지 않은 상태입니다.
3. 각각 메서드 명령 처리
- 이제 각각 메서드로 분리해놓은 곳에 명령을 처리해 보도록 하겠습니다.
1) 큰 메뉴 출력
- 이제부터는 메서드 부분만 코드로 처리하고 마지막에 전체 코드를 첨부하겠습니다.
## StudentArrayMain.java - printMenu() - 코드
...
//첫 메뉴 출력
public static void printMenu() {
System.out.println("=======메뉴=======");
System.out.println("1. 학생추가");
System.out.println("2. 성적수정");
System.out.println("3. 학생삭제");
System.out.println("4. 학생조회");
System.out.println("5. 프로그램종료");
System.out.print("메뉴 선택 : ");
}
...
- 단순하게 메뉴를 출력하도록 처리했습니다.
## StudentArrayMain.java - printMenu() - 결과
- 아직 1~4번의 메뉴를 선택하면 기능이 없어서 반복해서 다시 메뉴가 뜹니다.
- 1~5번이 아닌 정수를 누르면 1~5사이 정수를 입력하라고 뜹니다.
- 5를 누르면 반복문이 종료되는 것을 확인할 수 있습니다.
2) 학생 추가 메뉴
- 이번에는 학생을 추가하는 addStudent() 메서드 부분을 처리하겠습니다.
## StudentArrayMain.java - addStudent() - 코드
...
//학생추가
public static void addStudent() {
//메뉴선택으로 인한 입력버퍼에 남아 있는 엔터 제거
scan.nextLine();
//생성자가 이름만 처리하므로 이름만 받음
System.out.print("추가할 학생이름 : ");
//입력한 이름을 담는 변수
String name = scan.nextLine(); //이름에 공백이 있을지도 모르기 때문
//학생배열에 새로운 인스턴스 생성 - 입력받은 이름으로 생성
stds.add(new Student(name));
//배열 학생수 담는 변수 - 방금 추가된 학생의 위치 찾으려고 사용
int size = stds.size();
//현재 추가된 학생만 담기
Student std = stds.get(size - 1); //마지막 인덱스번호는 개수보다 1개 작음
//학생정보 출력
System.out.println("=====추가된 학생정보=====");
std.printInfo();
}
...
- 처음 메뉴 선택했을 때 nextInt()로 정수만 받아와서 입력버퍼에 엔터가 남아있습니다.
- 그래서 [ scan.nextLine(); ] 를 처음에 입력해서 엔터를 없애지 않으면 학생이름을 추가할 수가 없습니다.
- 한번 코드를 삭제해서 비교해보시길 바랍니다.
- 추가할 학생의 이름을 받고, add()메서드로 ArrayList에 새로운 인스턴스를 추가해 줍니다.
- 그리고 현재 추가된 학생은 마지막 학생이므로 학생수를 받는 size() 메서드를 통해 마지막 인덱스번호를 구합니다.
- 그리고 현재 추가된 학생만 얻는 get() 메서드를 사용해서 학생 정보를 출력받습니다.
## StudentArrayMain.java - addStudent() - 결과
- 학생을 2명 추가해 봤습니다.
- 그럼 번호는 자동으로 배정되는 것을 확인할 수 있습니다.
- 국어, 영어, 수학성적은 기본값인 0이 들어갑니다.
- 현재 성적 수정은 하지 않겠습니다.
3) 학생 조회 메뉴
- 이번에는 학생 전체를 조회하는 viewStudent() 메서드 부분을 처리하겠습니다.
- 학생이 한명도 없는 경우와 있는 경우를 나눠서 처리해야 합니다.
## StudentArrayMain.java - viewStudent() - 코드
...
//학생조회
//학생조회
public static void viewStudent() {
//학생 배열의 개수를 담는 변수
int size = stds.size();
//등록된 개수가 없다면 해당 코드 출력
if(size == 0) {
System.out.println("등록된 학생이 없습니다.");
return; //메서드 벗어나기
}
System.out.println("=====1학년 1반 모든 학생 정보=====");
//향상된 for문 통한 모든 학생 출력
for(Student std : stds) {
std.printInfo();
}
}
...
- 이번에는 등록된 배열이 없는 경우와 있는 경우를 나눠서 처리합니다.
- 배열이 있으면 여러 배열일 수 있으므로 향상된 for문 통해 출력해 줍니다.
## StudentArrayMain.java - viewStudent() - 결과
- 처음부터 학생 조회를 하면 학생정보가 없다고 뜹니다.
- 학생추가 후 조회를 하면 학생 전부를 확인할 수 있습니다.
- 아직은 간단하게 ArrayList를 단순하게 배웠기 때문에 추후에 제너릭에 대해 더 배우고 자세한 기능들을 해보는 시간을 갖겠습니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 35강 ArrayList 클래스 (0) | 2024.01.29 |
---|---|
[JAVA강좌] 34강 다차원 배열 (0) | 2024.01.29 |
[JAVA] 33강 자바 객체 배열 - 학생 성적 관리 (0) | 2024.01.29 |
[JAVA강좌] 32강 자바 배열 - 배스킨라빈스31게임 (0) | 2024.01.29 |
[JAVA강좌] 31강 자바 배열 - 로또 프로그램 (1) | 2024.01.29 |