
1. 클래스 실습 - 학생 관리 프로그램 만들기
1) 추상클래스 Student
~ 필드
: 이름, 과목(국어, 영어, 수학), 점수 총합, 평균
public abstract class Student {
protected String name;
protected int kor;
protected int eng;
protected int mat;
protected int sum;
protected double avg;
→ protected는 같은 패키지를 포함하며, 다른 패키지라고 하더라도 상속관계에 있다면 접근을 허용함
~ 생성자
public Student(String name, int kor, int eng, int mat) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
}
~ 추상메서드
public abstract int getSum();
public abstract double getAvg();
public abstract void showInfo(); // 이름, 합계, 평균을 한 줄에 출력 (목록에서 사용)
public abstract void showDetail(); // 모든 속성값을 각 한 줄마다 출력 (검색에서 사용)
~ getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = 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 getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
2) Student 클래스를 상속받는 EnglishLinguisticStudent(영어영문학과) 학생 클래스
~ 필드
private int literature; // 문학(영문학)
private int translation; // 번역
~ 생성자
- Student 클래스를 상속받았기 때문에 name, kor, eng, mat가 포함되어있음
public EnglishLiguisticStudent(String name, int kor, int eng,
int mat, int literature, int translation) {
super(name, kor, eng, mat);
this.literature = literature;
this.translation = translation;
// 상속받아서 내가 가지고 있으니까, this로 접근 가능
this.sum = kor + eng + mat + literature + translation;
// 슈퍼클래스에서 만들어진 필드이니까 super로 접근 가능
super.avg = this.sum / 5.0;
}
~ 추상메서드
- Student 클래스에서 상속받은 showInfo()와 showDetail()을 오버라이딩함
@Override
public void showInfo() {
System.out.printf("[영어 영문학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", name, sum, avg);
}
@Override
public void showDetail() {
System.out.println("[영어 영문학] " + name);
System.out.println("국어 : " + kor);
System.out.println("영어 : " + eng);
System.out.println("수학 : " + mat);
System.out.println("문학 : " + literature);
System.out.println("번역 : " + translation);
System.out.println("합계 : " + sum);
System.out.printf("평균 : %.2f\n", avg);
System.out.println();
}
3) Student 클래스를 상속받는 ComputerScienceStudent(컴퓨터공학과) 학생 클래스
~ 필드
public class ComputerScienceStudent extends Student{
private int java;
private int network;
private int linux;
~ 생성자
public ComputerScienceStudent(String name, int kor, int eng, int mat, int java,
int network, int linux) {
super(name, kor, eng, mat);
this.java = java;
this.network = network;
this.linux = linux;
}
→ 생성자에서 합계 평균을 구하지 않고, getter를 요청받을 때 합계와 평균을 계산하여 반환
~ 추상메서드의 내용을 구성함
→ Student 클래스에서 상속받은 showInfo()와 showDetail(), getSum(), getAvg()을 오버라이딩함
① 학생의 간단한 정보를 출력하는 메서드 showInfo()
@Override
public void showInfo() {
System.out.printf("[컴퓨터 공학] 이름 : %s, 합계 : %d, 평균 : %.2f\n",
name, getSum(), getAvg());
}
② 학생의 자세한 정보를 출력하는 메서드 showDetail()
@Override
public void showDetail() {
System.out.println("[컴퓨터 공학] " + name);
System.out.println("국어 : " + kor);
System.out.println("영어 : " + eng);
System.out.println("수학 : " + mat);
System.out.println("자바 : " + java);
System.out.println("네트워크 : " + network);
System.out.println("리눅스 : " + linux);
System.out.println("함계 : " + getSum());
System.out.printf("평균 : %.2f\n", getAvg());
System.out.println();
}
③ 성적의 총합을 반환하는 메서드 getSum()
@Override
public int getSum() {
sum = kor + eng + mat + java + network + linux;
return sum;
}
④ 성적의 평균을 계산하여 반환하는 메서드 getAvg()
@Override
public double getAvg() {
avg = sum / 6.0;
return avg;
}
~ 과목별 성적의 값을 반환할 getter/setter
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public int getNetwork() {
return network;
}
public void setNetwork(int network) {
this.network = network;
}
public int getLinux() {
return linux;
}
public void setLinux(int linux) {
this.linux = linux;
}
4) 프로그램의 기능을 구성하는 Handler 클래스
~ 다른 패키지(model)에 있는 Student 클래스를 import 하고, 값을 저장할 배열 준비함
import model.Student;
public class Handler {
private Student[] arr = new Student[10];
~ 목록에 추가 기능 구현
public int insert(Student st) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == null) {
arr[i] = st;
return 1;
}
}
return 0;
}
~ 목록 출력 기능 구현
public void showList() {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
arr[i].showInfo();
}
}
System.out.println();
}
~ 검색 기능 구현
public Student find(String find) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
if(arr[i].getName().equals(find)) {
return arr[i];
}
}
}
return null;
}
→ 배열을 다룰 때에는 배열의 자료형을 확인하고 진행할 것.
→ Student의 배열이므로, 각 배열의 칸(arr[i])에는 학생 객체가 담길 수 있음
→ 빈칸이 아닌 곳의 학생의 이름이 전달받은 이름과 일치하면 그 학생(Student)객체를 반환함
~ 삭제 기능 구현
① 전달받은 객체의 이름과 arr[i] 객체의 이름을 비교하여 일치하면 arr[i]를 삭제하는 방식
public int delete(Student st) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
if(arr[i].getName().equals(st.getName())) {
arr[i] = null;
return 1;
}
}
}
return 0;
}
② 기존에 만든 find() 메서드를 이용하여 전달받은 객체가 arr[i]와 같으면 arr[i]를 삭제하는 방식
public int delete2(Student st) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == st) {
arr[i] = null;
return 1;
}
}
return 0;
}
→ == 연산자는 NullPointerException 을 발생시키지 않음
→ . 왼쪽이 null이면, NullPointerException 이 발생함
③ find는 객체를 반환하지만, indexOf는 객체가 위치하는 배열의 index를 반환하게 만듦.
public int indexOf(String name) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null && arr[i].getName().equals(name)) {
return i;
}
}
return -1;
}
→ index번째의 객체가 있으면 객체를 제거하고 1을 반환함
public int delete(int index) {
if(arr[index] != null) {
arr[index] = null;
return 1;
}
return 0;
}
5) 사용자와 상호작용하는 Main 클래스 작성
~ Handler 클래스의 함수를 호출할 handler 객체 생성
import java.util.Scanner;
import model.ComputerScienceStudent;
import model.EnglishLiguisticStudent;
import model.Student;
public class Main {
private static Handler handler = new Handler();
→ static 을 사용해서 main 클래스의 모든 객체가 공유하도록 함
~ 필요한 지역변수 생성
Scanner sc = new Scanner(System.in);
Student st = null;
int select;
int row;
String name;
~ 메뉴 출력 및 사용자 입력
do {
System.out.println("\n\t학생 관리 프로그램\n");
System.out.println("1. 목록");
System.out.println("2. 추가");
System.out.println("3. 검색");
System.out.println("4. 삭제");
System.out.println("0. 종료");
System.out.print("선택 : ");
select = Integer.parseInt(sc.nextLine());
~ 사용자 입력에 따른 Handler 기능 호출
① 목록 출력
switch(select) {
case 1 :
handler.showList();
break;
② 목록에 추가
case 2 :
System.out.print("학생 유형을 선택하세요 (1. 영문과 | 2. 컴공과) : ");
select = Integer.parseInt(sc.nextLine());
if(select == 1) st = makeEnglishLinguisticStudent(sc);
if(select == 2) st = makeComputerScienceStudent(sc);
row = handler.insert(st);
System.out.println(row == 1 ? "추가 성공" : "추가 실패");
break;
③ 목록에서 검색
case 3 :
System.out.print("검색할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
st = handler.find(name); // 이름을 전달하여 일치하는 학생을 찾기
if(st != null) st.showDetail();
else System.out.println(name + " 학생을 찾을 수 없습니다.");
break;
④ 목록에서 삭제
- 이름을 전달받아서, 이름이 일치하는 학생 객체를 반환하고, 그 학생을 전달하여 배열에서 제거
case 4 :
System.out.print("삭제할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
st = handler.find(name);
row = handler.delete(st);
System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
break;
}
- 인덱스를 이용하는 방법 (단, 이 경우에는 지역 변수에 index를 선언해줘야함.)
int index;
case 4 :
System.out.print("삭제할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
index = handler.indexOf(name);
row = handler.delete(index);
System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
break;
}
⑤ 사용자가 0을 입력하면 프로그램을 종료
} while(select != 0);
sc.close();
System.out.println("종료");
}
6) 사용자의 필요한 정보를 입력을 받아 객체를 생성하는 메서드
~ 컴퓨터 공학과 학생
private static Student makeComputerScienceStudent(Scanner sc) {
String name;
int kor, eng, mat, java, network, linux;
System.out.print("이름 : ");
name = sc.nextLine();
System.out.print("국어 : ");
kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 : ");
eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 : ");
mat = Integer.parseInt(sc.nextLine());
System.out.print("자바 : ");
java = Integer.parseInt(sc.nextLine());
System.out.print("네트워크 : ");
network = Integer.parseInt(sc.nextLine());
System.out.print("리눅스 : ");
linux = Integer.parseInt(sc.nextLine());
Student st = new ComputerScienceStudent(name, kor, eng, mat, java, network, linux);
return st;
}
~ 영어영문과 학생
private static Student makeEnglishLinguisticStudent(Scanner sc) {
String name;
int kor, eng, mat, literature, translater;
System.out.print("이름 : ");
name = sc.nextLine();
System.out.print("국어 : ");
kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 : ");
eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 : ");
mat = Integer.parseInt(sc.nextLine());
System.out.print("문학 : ");
literature = Integer.parseInt(sc.nextLine());
System.out.print("번역 : ");
translater = Integer.parseInt(sc.nextLine());
Student st = new EnglishLiguisticStudent(name, kor, eng, mat, literature, translater);
return st;
}
7) 결과








'JAVA > JAVA Note' 카테고리의 다른 글
| [JAVA Note] 19. Collection (1) | 2022.11.16 |
|---|---|
| [JAVA Note] 18. Object (0) | 2022.11.06 |
| [JAVA Note] 16. 추상클래스 (0) | 2022.11.02 |
| [JAVA Note] 15. 상속 (0) | 2022.11.02 |
| [JAVA Note] 14. 접근 제한자 (0) | 2022.10.30 |
댓글